【问题标题】:Replacing a VB6 DLL called by a CreateDispatch call with a C# Equivalent用 C# 等效项替换由 CreateDispatch 调用调用的 VB6 DLL
【发布时间】:2010-09-23 15:36:49
【问题描述】:

现有的 Visual C++ 应用程序进行以下调用;

BOOL bRet = pMyClass.CreateDispatch("BlahBlah.MyClass");
if ( !bRet )
{
    // Error handling snipped
}
else
{
    pMyClass.MyMethod();
    pMyClass.ReleaseDispatch();    
}

pMyClass 显然是由 ClassWizard 自动生成的一个类,它继承自 COleDispatchDriver。

它所引用的实际 DLL 是 VB6 的,它正在迁移到 C#,作为总体上摆脱 VB 的努力的一部分。

我的问题是……我需要做些什么来确保 C# 程序集的工作方式与原始 VB6 模块的工作方式相同吗?目前,C# 看起来像这样;

[ComVisible(true)]
[ProgId("BlahBlah.MyClass")]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class MyClass
{
    ...

    public void MyMethod()
    {
        ...
    }
}

这就足够了吗?在 MyClass 上设置公共字符串字段(代码中未显示)时,是否需要注意任何问题?

请注意,我不是此代码的原始作者 - 它来自旧系统,我只是在进行迁移。

【问题讨论】:

    标签: c# visual-c++ vb6-migration


    【解决方案1】:

    CreateDispatch 调用使用后期绑定与 COM 服务器通信。 ClassInterfaceType.AutoDispatch。使用 AutoDual 很好,它还包括后期绑定支持。具有显着优势,您可以在某一天使它更快。后期绑定并不便宜。

    【讨论】:

    • 请原谅新手的问题,但我以前从未真正使用过 COM。我在组件服务下没有看到这个特定的程序集,但我在 HKEY_CLASSES_ROOT\CLSID\ 下找到了它的密钥。这是否意味着它是用 regsvr32 注册的?如果是这样,C#.NET 以相同方式使新程序集对 CreateDispatch 可见的等效项是什么?
    • 是的,这很正常。您将 Regasm.exe 用于 .NET 程序集,而不是 Regsvr32.exe。如果您勾选 Project + Properties,Build 选项卡,“Register for COM interop”,它是自动的。
    • 我读过需要一个类型库——我需要手动将它作为资源嵌入到我的 .NET 程序集中吗?还是“注册 COM 互操作”会自动执行此操作?
    • 抱歉,这不是订阅服务。我没有看到任何证据表明你认为我帮助你的尝试是有帮助的。通过悬赏您的问题,您可以获得更好的帮助。
    • 抱歉,我应该把最后一部分变成一个新问题。感谢您的帮助 - 您为我指明了正确的方向,非常感谢。
    猜你喜欢
    • 2013-02-27
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多