将C ++函数指针设置为C#委托

时间:2012-07-27 06:54:51

标签: c# c++ callback com-interop

我有一个非托管的c ++应用程序作为COM客户端和一个C#COM服务器。 现在我希望COM服务器可以调用c ++函数。

C#:

[ClassInterface(ClassInterfaceType.AutoDual)]
public class SomeType
{
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void DeleCallBack(string info);
    public DeleCallBack CallBack;
    public void  SetCallBack(ref IntPtr ptr)
    {
        CallBack = (DeleCallBack)Marshal.GetDelegateForFunctionPointer(ptr, typeof(DeleCallBack));
    }
}

C ++:

HRESULT hr = E_FAIL;
CComPtr<WindowsFormsApplicationVC9::_SomeType> spTmp;
hr = spTmp.CoCreateInstance(__uuidof(WindowsFormsApplicationVC9::SomeType));
if (SUCCEEDED(hr))
{
    spTmp->SetCallBack(OnCallBack);
}
void  OnCallBack(BSTR info)
{
    // c++ function call...;
}

我不确定将OnCallBack函数指针传递给SetCallBack是正确的方法。 我注意到调用GetDelegateForFunctionPointer的一些示例应该是GetProcessAddress来获取函数指针地址,但我不能这样做,因为可能有不同的c ++ COM客户端具有不同的函数名。

任何建议?

1 个答案:

答案 0 :(得分:0)

一种方法是通过__declspec(dllexport)公开你的C ++函数,然后简单地为这些函数编写P / Invoke。现在,您可以将这些P / Invoke函数用作代理。

内心深处这基本上是GetProcAddress方法,但C#编译器使你在语法上更好。