【问题标题】:How does a C# DLL marked for COM interop work in a vb6 application标记为 COM 互操作的 C# DLL 如何在 vb6 应用程序中工作
【发布时间】:2012-08-14 17:25:54
【问题描述】:

我有一个为 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 对象的处理,我将如何处理

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

【问题讨论】:

  • 它是一个进程内的com组件,所以它被加载到VB6 exe的进程中;它不会在任何地方显示为单独的进程,看看@msdn.microsoft.com/en-us/library/xk1120c3(v=vs.100).aspx
  • 我们注意到,每次单击按钮并关闭表单时,即使添加 set a= Nothing,所使用的内存也会增加 100 kb
  • 你无法从一次内存增加中看出什么。各种库会以块的形式分配内存,它会随着最小化和恢复窗口等简单的操作而上升和下降。

标签: c# .net vb6


【解决方案1】:

在您的情况下,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 对象一样依赖这种行为。

【讨论】:

    【解决方案2】:

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

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

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

    Set a = Nothing
    

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

    【讨论】:

    • ...就像 VB6 中的任何其他对象一样。
    • 两件事:除非对象的释放顺序对您很重要,或者引用在模块级别或全局范围内,否则这样做没有意义。 VB 足够聪明,可以清除对变量的引用,而且速度比以往任何时候都快。此外,这有点误导。如果您有另一个对象引用 b 和 Set b = a,则在此之后使用 Set a = Nothing 不会破坏该对象,只需减少引用计数。
    猜你喜欢
    • 1970-01-01
    • 2011-07-02
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2012-07-19
    相关资源
    最近更新 更多