标记为COM互操作的C#DLL如何在vb6应用程序中工作

时间:2012-07-24 09:27:43

标签: c# .net vb6

我有一个简单的C#库,我已经为COM互操作注册了。我已将此参考添加到我的vb6应用程序中。我运行我的vb应用程序,一切正常。我想知道的是这是如何工作的。我检查了任务mamager,我在进程中看到了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对象

我们注意到每次点击按钮并关闭表单时,使用的内存会增加几百kb甚至添加set a = Nothing

2 个答案:

答案 0 :(得分:4)

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

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

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

在您的情况下,当COM类自行崩溃时,需要采取极端措施来确保.NET对象被销毁,但是您不能像所有.NET对象一样依赖此行为。

答案 1 :(得分:3)

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

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

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

Set a = Nothing

确保周围没有其他参考文献。