如何解决使用Microsoft.Office.Interop.Word时触发的RPC_E_CALL_REJECTED异常
问题修复方案
核心错误原因排查
你遇到的0x80010001 (RPC_E_CALL_REJECTED)错误和路径识别无关,是两类问题叠加导致:
- 路径拼接逻辑错误,生成了非法路径
SaveAs2参数传递不符合COM调用规范,同时Word进程繁忙时没有处理调用重试机制
具体修复步骤
- 修正路径获取逻辑:
SaveFileDialog.FileName本身返回用户选择的完整绝对路径,不需要额外拼接Directory.GetCurrentDirectory(),你的原有拼接逻辑会生成双重路径的非法值 - 修正参数传递方式:
SaveAs2的第一个参数要求为ref object类型,不能直接传入string类型变量,需要先将路径包装为object变量再传引用 - 解决RPC调用被拒绝问题:确保运行代码的线程单元状态为STA,可添加简单的重试机制处理Word繁忙的情况
修正后可运行代码
// 建议在程序入口或调用线程上添加[STAThread]特性 if (saveFileDialog_Docx.ShowDialog() == DialogResult.OK) { string savePath = saveFileDialog_Docx.FileName; object savePathObj = savePath; // 加3次重试机制避免Word繁忙报错 int retryCount = 3; while (retryCount > 0) { try { document.SaveAs2( ref savePathObj, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); break; } catch (System.Runtime.InteropServices.COMException ex) when ((uint)ex.ErrorCode == 0x80010001) { retryCount--; System.Threading.Thread.Sleep(100); if (retryCount == 0) throw; } } }
补充说明:你之前写的
@""+ dirpath写法完全无效,verbatim标识符@只对编译期的字符串字面量生效,对已经生成的字符串变量没有任何作用,不需要加这段冗余代码。
内容的提问来源于stack exchange,提问作者FLK Coding
相关产品推荐
相关产品推荐

