Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用64位非托管回调时的调用约定_C#_Pinvoke_32bit 64bit_Unmanaged - Fatal编程技术网

C# 使用64位非托管回调时的调用约定

C# 使用64位非托管回调时的调用约定,c#,pinvoke,32bit-64bit,unmanaged,C#,Pinvoke,32bit 64bit,Unmanaged,我在C代码中使用了一个非托管处理程序,委托的定义如下 [UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate int Callback (arguments) 它在32位版本中运行良好,我问我在64位版本中需要做哪些更改。包含处理程序的dll的C头将所有函数定义为\uu stdcall如果是WIN32,将所有函数定义为\uu fastcall如果是WIN32(即dll有32位和64位版本)。但在NET文档中,据

我在C代码中使用了一个非托管处理程序,委托的定义如下

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate int Callback (arguments)

它在32位版本中运行良好,我问我在64位版本中需要做哪些更改。包含处理程序的dll的C头将所有函数定义为
\uu stdcall
如果是WIN32,将所有函数定义为
\uu fastcall
如果是WIN32(即dll有32位和64位版本)。但在NET文档中,据说不支持fastcall。我不明白这一切意味着什么,我应该如何更改(或不更改)64位的代码?

您不需要做任何事情。以64位代码为目标时忽略调用约定指令,因为该体系结构只有一个调用约定。让代码保持原样。对于32位和64位编译,它都能正常工作

使用32位版本,因为64位版本是fastcall,Net doc说不支持fastcall。DLL和C头随附了我买的硬件,我还没有编写。因此,我理解您的-1是针对硬件供应商的。编写非托管包装程序,使用
\uu stdcall
并转发到
\uu fastcall
版本(或使用C++/CLI立即将这些函数作为托管函数公开),反之则用于回调(将
\uuu fastcall
委托传递给调用
\uu stdcall
托管回调的非托管代码)。如果有很多函数,您可能不想手动执行此操作,因此可能需要一些代码来生成它们。只有在32位版本无法在64位Windows上运行时,才需要执行所有这些操作(如果它直接与驱动程序接口,则可能是这种情况)。如果可以,只需将托管代码编译为“首选32位”并且只使用32位版本,这要简单得多。很可能制造商根本不关心.NET代码与DLL的接口。在非托管代码中,这根本不是一个问题,因为您#包括头并离开。无需修改源代码,因为调用约定是(预应用的)的一部分如果供应商关心托管代码,他们应该自己提供API。构建硬件和编写驱动程序已经够难了——托管代码是其他人的问题。