установить указатель функции 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 ответ:
Один из способов сделать это-представить свои функции C++ через
__declspec(dllexport)
, а затем просто написать P/Invoke для этих функций. Теперь вы можете использовать эти функции P/Invoke в качестве делегатов.В глубине души это, по сути, подход
GetProcAddress
, но компилятор C# делает его синтаксически более приятным для вас.