0

我有一个为 COM 互操作注册的简单 C# 库。我已在我的 vb6 应用程序中添加了对此的参考。我运行了我的 vb 应用程序,一切正常。我想知道这是如何工作的。我检查了任务管理器,我在进程中看到了 VB6.exe,但我看不到任何与 .net 相关的内容。

代码:VB6

Dim a As CsharpdllForVBHack.ComAdder
Private Sub Command1_Click()
    Set a = New CsharpdllForVBHack.ComAdder
    a.Add 1, 4
End Sub

代码:C#.net

 [ComVisible(true)]
 public class ComAdder
 {
    [ComVisible(true)]
    public void add (int a,int b)
    {
        TestForm testForm = new TestForm(a+b);
        testForm.ShowDialog();
    }
 }

我也想知道一旦我完成了如何处理这个 com 对象

我们注意到,每次单击按钮并关闭表单时,使用的内存都会增加 100 kb,即使添加 set a=Nothing

4

2 回答 2

5

在您的情况下,VB 实例化了一个 COM 可调用包装类 (CCW),它位于 .NET 程序集中。通常的 COM 类型的事情发生在这里。首先,COM 在注册表中查找该类的 GUID,并找到程序集 DLL,并将其加载到 VB 组件的进程中。COM 试图找到一个函数,该函数检索一个指向标准 COM 接口的指针,您可以使用它来实例化 COM 类。您现在有一个 COM 对象。

但这还不是全部。实例化 CCW 时,它还确保加载 .NET 运行时,然后创建 .NET 类的实例。您的 COM 对象有一个基于 .NET 接口的接口。CCW 实质上将所有来自 COM 接口的调用转发到 .NET 接口,将 COM 数据类型转换为 .NET 数据类型,如果您有返回值和输出参数,则再次返回。

至于你的第二点 - 在这种特殊情况下,不要打扰。当 VB 到达过程结束时(或 Exit Sub,或引发错误),它会跳转到清除所有过程级变量的子例程。如果清除对象变量,则对 COM 对象的引用计数会减少。如果引用计数为零,则 COM 实例会自行终止。

在您的情况下,当 COM 类杀死自己时,它会采取极端措施来确保 .NET 对象被销毁,但您不能像所有 .NET 对象一样依赖这种行为。

于 2012-07-24T12:22:11.827 回答
3

您问题的第一部分过于宽泛,无法在此处回答,请查看COM Interop以获取有关此主题的更多信息。

您问题的第二部分回答如下:

要在 VB6 中处理对象,请执行以下操作:

Set a = Nothing

确保周围没有其他参考资料。

于 2012-07-24T09:59:24.953 回答