У меня есть функция в DLL:
char __usercall MyUserCallFunction<al>(int arg1<esi>)
Поскольку я ненавижу себя, я бы хотел вызвать это из C #, используя P / Invoke.
Обычно это можно сделать, получив делегат функции, например:
[UnmanagedFunctionPointer(CallingConvention.ThisCall, CharSet = CharSet.Auto, SetLastError = true)]
public delegate char DMyUserCallFunction(IntPtr a1);
И затем вызвать его, выполнив:
var MyFunctionPointer = (DMyUserCallFunction)Marshal.GetDelegateForFunctionPointer(AddressOfFunction, typeof(DMyUserCallFunction));
MyFunctionPointer(IntPtr.Zero);
Однако для пользовательских соглашений о вызовах это может привести к сбою программы. Есть ли какой-то способ, которым я могу сделать это, используя небезопасный код или какую-то функцию-обертку, которая помещает делегатов на место, но не заставляет меня писать C ++ DLL?
Спасибо!
Edit:
Как предложил dtb, я создал очень маленькую C ++ DLL, которую я использую через P / Invoke для вызова функции. Для всех, кому интересно, функция в C ++ выглядит так:
extern "C" __declspec(dllexport) int __stdcall callUsercallFunction(int functionPointer, int arg1 )
{
int retVal;
_asm
{
mov esi, arg1
call functionPointer
mov retVal, eax
}
//Fake returning al, the lower byte of eax
return retVal & 0x000000FF;
}