在c#中调用UnmanagedFunctionPointer来实现自定义调用约定

本文关键字:调用 实现 自定义 约定 UnmanagedFunctionPointer | 更新日期: 2023-09-27 18:09:28

我在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?

谢谢!

编辑:

根据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;
}

在c#中调用UnmanagedFunctionPointer来实现自定义调用约定

在c#中实现自定义调用约定是没有希望的。您必须在本机DLL或c++/CLI DLL中执行此操作。