Вызов UnmanagedFunctionPointer в C # для пользовательских соглашений о вызовах - PullRequest
5 голосов
/ 24 сентября 2011

У меня есть функция в 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;
}

1 Ответ

2 голосов
/ 24 сентября 2011

Нет надежды на реализацию пользовательских соглашений о вызовах в C #. Вы должны сделать это либо в собственной DLL, либо в C ++ / CLI DLL.

...