C#中使用Late Binding Interop连接已打开Word实例获取信息失败解决方案
问题分析与解决方案
你的Late Binding代码报错的核心原因是:Activator.CreateInstance(wordType)会创建一个全新的Word应用程序实例,而非连接到你已经打开文档的那个正在运行的Word进程。这个新实例中没有打开的文档,因此触发了"无可用文档"的错误。
而非Late Binding代码使用Marshal2.GetActiveObject直接获取了系统中已运行的Word实例,所以能正常读取活动文档路径。要实现Late Binding的目标,你需要通过反射调用GetActiveObject来获取现有实例,而非创建新实例。
正确的Late Binding实现代码
// 通过反射获取Marshal类的类型 Type marshalType = Type.GetType("System.Runtime.InteropServices.Marshal"); // 获取GetActiveObject方法 MethodInfo getActiveObjectMethod = marshalType.GetMethod("GetActiveObject", new Type[] { typeof(string) }); // 调用方法获取已运行的Word实例 dynamic word = getActiveObjectMethod.Invoke(null, new object[] { "Word.Application" }); // 读取活动窗口的文档路径 Console.WriteLine(word.ActiveWindow.Document.FullName);
关键说明
- 这段代码通过反射调用
System.Runtime.InteropServices.Marshal.GetActiveObject,无需引用Office Interop库,完全依赖系统已安装的Office COM组件。 - 如果当前没有运行的Word实例,
GetActiveObject会抛出COMException,建议添加异常处理逻辑。 - 使用
dynamic类型可以在Late Binding场景下直接调用Word对象的属性和方法,和早期绑定的语法一致。
内容的提问来源于stack exchange,提问作者Silve2611
相关产品推荐
相关产品推荐

