C# ';接口未注册';ATL进程外回调接口出错

C# ';接口未注册';ATL进程外回调接口出错,c#,c++,com,atl,C#,C++,Com,Atl,我有一个ATL进程内服务器,它实现了如下回调接口: .idl interface IClientEvents : IUnknown{ [] HRESULT TestEvent(void); }; interface IATLSimpleObject : IDispatch{ [id(1)] HRESULT Advise([in] IClientEvents* clientEvents); [id(2)] HRESULT Unadvise(void); }; .h p

我有一个ATL进程内服务器,它实现了如下回调接口:

.idl

interface IClientEvents : IUnknown{
    [] HRESULT TestEvent(void);
};

interface IATLSimpleObject : IDispatch{

    [id(1)] HRESULT Advise([in] IClientEvents* clientEvents);
    [id(2)] HRESULT Unadvise(void);
};
.h

private:
    IClientEvents* m_ClientEvents;
public:
    STDMETHOD(Advise)(IClientEvents* clientEvents);
    STDMETHOD(Unadvise)(void);
.cpp

STDMETHODIMP CATLSimpleObject::Advise(IClientEvents* clientEvents)
{
    m_ClientEvents = clientEvents;
    m_ClientEvents->AddRef();

    return S_OK;
}

STDMETHODIMP CATLSimpleObject::Unadvise(void)
{
    m_ClientEvents->Release();
    m_ClientEvents = NULL;

    return S_OK;
}
C#客户

public partial class Form1 : Form, ATLProject1Lib.IClientEvents
{
    private ATLProject1Lib.ATLSimpleObject ATLSimple = new ATLProject1Lib.ATLSimpleObject();

    private void Form1_Shown(object sender, EventArgs e)
    {
        ATLSimple.Advise(this);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        ATLSimple.Unadvise();
    }
它工作正常,但我需要在进程外服务器中执行完全相同的操作,然而,在执行时,调用“ATLSimple.advice(this)”时,我会收到一个“Interface not registed”(80040105)错误


我花了几个小时寻找类似的问题,但什么也找不到。任何帮助都将不胜感激。

为了在proc中实现这一点,您需要在进程之间编组接口。最有可能的情况是,您希望依赖自动化编组,它使用从IDL生成的typelib来查找要编组的内容和方式。问题是,它只适用于IDL中标记为
[oleautomation]
[dual]
或两者兼有的接口

最好的办法是将要编组的接口标记为
[oleautomation]
,并添加一条注释,如“如果删除此项,编组魔术就会消失”