Interaction.CreateObject创建旧对象

本文关键字:对象 创建 CreateObject Interaction | 更新日期: 2023-09-27 18:24:05

我正在将一个VB6应用程序转换为C#.net并开发共享加载项。单击MS Word中的一个按钮,我想打开我的应用程序,为此我正在创建一个类的对象。

objApp = Interaction.CreateObject("DocSys.Application");

但是当我添加.net项目的引用时,这行代码总是返回旧的vb6应用程序instace。我应该怎么做才能得到.net对象。

Interaction.CreateObject创建旧对象

有不止一种方法可以解决这个问题。例如,忘记将接口和类设置为[ComVisible(true)]。或者忘记注册COM服务器,使用Regasm.exe/codebase/tlb显式完成。或者使用错误版本的Regasm.exe,64位版本将写入错误的注册表项。

与CreateObject()更相关的是,C#类上的[ProgId]属性对于确保创建VB6服务器的精确替代品至关重要。如果客户端代码使用早期绑定,那么接口和类上的[Guid]属性必须与VB6服务器使用的Guid完全匹配。当然,方法和属性必须与VB6服务器使用的方法和属性完全匹配,顺序也非常重要。

将橙子与苹果进行比较的最佳方法是使用Oleview.exe实用程序。从Visual Studio命令提示符运行它,并使用File+View Typelib。首先选择您的VB6服务器。复制/粘贴您在文本文件中看到的IDL并保存它,这样您就不必重复执行此操作。

在C#程序集上运行tlbexp.exe,为C#服务器创建类型库。再次运行Oleview.exe并选择该.tlb文件。现在,您可以将服务器的IDL与VB6服务器中的IDL进行比较。确保在guid、方法和属性上得到完全匹配。


最后但同样重要的是,如果客户端代码实际使用Interaction.CreateObject(),那么它就是一个.NET应用程序。这意味着您根本不应该创建[ComVisible]COM服务器。它应该是一个常规的.NET程序集,只需添加对它的引用并直接使用公共类。