小编Luk*_*uke的帖子

使用COM互操作时如何管理对象的生命周期?

我有一个用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)

com com-interop

7
推荐指数
1
解决办法
1068
查看次数

标签 统计

com ×1

com-interop ×1