【问题标题】:Interaction.CreateObject creating the old ObjectInteraction.CreateObject 创建旧对象
【发布时间】:2013-07-20 18:55:39
【问题描述】:

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

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

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

【问题讨论】:

  • 自从我搞砸了 VB6 及其 COM 支持以来已经有一段时间了,但这也许与正在注册共享程序实例的运行对象表有关?试着读一读。 stackoverflow.com/questions/11835617/…
  • @Shahar-Kashtan 我完全摆脱了这个概念,请帮我做什么。

标签: c# .net


【解决方案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程序集,只需添加对它的引用并直接使用公共类即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 2016-11-17
    • 2022-01-21
    • 1970-01-01
    • 2015-08-02
    • 2021-01-17
    相关资源
    最近更新 更多