我有一个用C#编写的托管COM对象和一个用C++(MFC和ATL)编写的本机COM客户端和接收器.客户端在启动时创建对象并建议其事件接口,并从其事件接口取消设置并在关闭时释放对象.问题是COM对象具有对接收器的引用,该接收器在垃圾收集运行之前不会被释放,此时客户端已经被拆除,因此通常会导致访问冲突.这可能不是一件大事,因为无论如何客户端都在关闭,但我想尽可能优雅地解决这个问题.我需要我的COM对象以更及时的方式释放我的接收器对象,我真的不知道从哪里开始,因为我的COM对象不能明确地使用接收器对象.
我的COM对象:
public delegate void TestEventDelegate(int i);
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITestObject
{
int TestMethod();
void InvokeTestEvent();
}
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ITestObjectEvents
{
void TestEvent(int i);
}
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(ITestObjectEvents))]
public class TestObject : ITestObject
{
public event TestEventDelegate TestEvent;
public TestObject() { }
public int TestMethod()
{
return 42;
}
public void InvokeTestEvent()
{
if (TestEvent != null)
{
TestEvent(42);
}
}
}
Run Code Online (Sandbox Code Playgroud)
客户端是标准的基于MFC对话框的程序,增加了对ATL的支持.我的下课班:
class CTestObjectEventsSink : public CComObjectRootEx<CComSingleThreadModel>, public ITestObjectEvents
{
public:
BEGIN_COM_MAP(CTestObjectEventsSink)
COM_INTERFACE_ENTRY_IID(__uuidof(ITestObjectEvents), ITestObjectEvents)
END_COM_MAP()
HRESULT …Run Code Online (Sandbox Code Playgroud)