最近我正在做一个涉及 DLL 模块(用 C# 创建)并且我需要在我的应用程序中使用(用非托管 C++ 编写)的小项目。为此,我使用了 ATL/COM。
我注意到,即使我在 C++ 应用程序中使用_com_ptr_t来处理我的核心 COM 接口,C# 对象的析构函数也仅在我的应用程序关闭时才被调用。
让我给你一些资料,让事情更清楚一点:
我的一些 C# 代码:
[ComVisible(true)]
[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
public interface ITestCOM
{
[DispId(1)]
void Connect([In, MarshalAs(UnmanagedType.U2)] ushort value);
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(ITestCOMEvents))]
public partial class TestCOM : ITestCOM
{
...
~TestCOM()
{
MessageBox.Show("DESTRUCTOR");
}
...
public void Connect(ushort value)
{
...
}
}
我正在使用以下内容创建 .tlb 文件:“ RegAsm.exe TestCOM.dll /tlb:Test.tlb /codebase ”
在我的 C++ 头文件中,我有:
#import "C:\...\mscorlib.tlb"
#import "......\TestCOM.tlb" named_guids exclude("ISupportErrorInfo")
#include <afxdisp.h>
#include <atlcom.h>
class Unit : public ::IDispEventSimpleImpl<0, Unit, &__uuidof(TestCOM::ITestCOMEvents)>
{
public:
BEGIN_SINK_MAP(Unit)
SINK_ENTRY_INFO(0, __uuidof(TestCOM::ITestCOMEvents), 0x1, OnEventCallback, &OnEventCallbackDef)
END_SINK_MAP()
...
private
TestCOM::ITestCOMPtr mTestCOM;
// NOTE: This would be the same as "_com_ptr_t<_com_IIID<TestCOM::ITestCOM, &__uuidof(TestCOM::ITestCOM)> > mTestCOM;"
}
我的 C++ 源文件创建了我的“mTestCOM”,如下所示:
mTestCOM.CreateInstance(TestCOM::CLSID_TestCOM)
基本上就是这样。我可以像这样使用我的任何 C#“TestCOM”对象的函数:
mTestCOM->Connect(7);
问题是:为什么我的 C# TestCOM 对象的析构函数仅在我的应用程序关闭时调用,而不是在我的 C++“单元”对象被销毁时调用?