c# - P/Invoke 和 C# 的自定义调用约定

标签 c# pinvoke calling-convention

我有一个业务案例,在使用 P/Invoke 时,我需要能够指定自己的调用约定。具体来说,我有一个使用非标准 ABI 的遗留 dll,并且我需要能够指定每个函数的调用约定。

例如,该 dll 中的一个函数通过 EAX 和 EBX 接受前两个参数,其余参数通过堆栈接受。另一个函数通过 ECX 接受一个参数,其余的在堆栈上。我有几百个这样的函数,并且希望避免编写自己的中间桥 DLL 来访问这些函数。

我的另一个选择是手动滚动我自己的自定义 P/Invoke,由于显而易见的原因,这是不可取的。

感谢任何帮助,谢谢,

最佳答案

我不明白您对自定义 P/Invoke 的意思,但我不明白如果没有带有内联汇编的非托管 C++,您如何摆脱困境。然而,由于几乎所有内容都作为 32 位值传递,因此您可能只需为每个函数签名编写一个代理,而不是每个函数一个代理。或者您可以编写一个代码生成器,从 XML 生成代理。不过,我不认为这个版本太不可取,因为所有代理功能都非常简单:

int RealFunction(int param1, const char * param2, char param 3);

int MyFunction(int param1, int param2, int param3) { // argument types do not matter as long as they are not doubles or structures
   __asm {
      mov eax, param1
      mov ebx, param2
      push param3
      call RealFunction
      ; depending on calling convention, you might need to do add esp, 12 here
      ; if RealFunction does not return its result in eax, you will need to do mov eax, <wherever the return value is> here
   }
}

关于c# - P/Invoke 和 C# 的自定义调用约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/390798/

相关文章:

c# - System.Runtime.InteropServices.ComTypes.IStream 到 System.IO.Stream

c - x64 帧指针应该指向哪里,为什么指向? ( Windows x64 ABI)

c# - 无法连接到 mongodb 服务器

c# - 如何获取最后一个错误(WSAGetLastError)?

c# - 我应该如何加载一次图像并在多线程 C# 应用程序中传递它?

c# - pinvoke 从 C 中的结构中获取数据

c++ - 为什么我不能为构造函数(C++)指定调用约定?

c++ - 使用 thiscall 约定调用 C++ 成员函数

c# - 在 .NET 语言之间共享类方法

c# - Clipboard.GetText 返回 null(空字符串)