установить указатель функции C++ в качестве делегата C#


У меня есть неуправляемое приложение c++ в качестве COM-клиента и COM-сервер C#. теперь я хочу, чтобы 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 4

1 ответ:

Один из способов сделать это-представить свои функции C++ через __declspec(dllexport), а затем просто написать P/Invoke для этих функций. Теперь вы можете использовать эти функции P/Invoke в качестве делегатов.

В глубине души это, по сути, подход GetProcAddress, но компилятор C# делает его синтаксически более приятным для вас.