0

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

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

但是这行代码总是返回旧的 vb6 应用程序实例,而我正在添加 .net 项目的引用。我应该怎么做才能获得 .net 对象。

4

1 回答 1

1

有不止一种方法可以解决这个问题。例如,忘记制作您的界面和类 [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 程序集,只需添加对它的引用并直接使用公共类。

于 2013-07-22T11:36:13.633 回答