c# - 从返回 int 的非托管代码中获取外部函数是否安全

标签 c# c++ pinvoke

[DllImport(MyUnmanagedLibrary, CallingConvention = CallingConvention.Cdecl)]
internal static extern int MyFunction();

假设这是我从非托管 C++ 库导入的函数。在这种情况下,外部函数被声明为返回一个 intint 的大小在托管 C# 代码中不会改变,但它会根据非托管 C++ 代码中的体系结构而改变。假设它返回一个 int 是否安全?我应该使用 IntPtr 作为返回值吗?还是别的?

最佳答案

int 在 C# 中是并且将永远是 System.Int32,关键是每个 C++ 编译器(理论上)都可以自由地使用类型大小做任何它想做的事情(在一定限度内),因此,如果您想避免不匹配,您应该更改代码的 C++ 端,使其返回一个固定大小的整数(例如 int32_t)。 IntPtr 无能为力,因为 int 没有定义为具有指针的大小(实际上,在 x86_64 Windows 上 int 是 32 位,而int * 是 64 位)。

另一方面,x86 Windows 上的任何编译器极不可能int 定义为不同于 32 位 2 的补码整数的任何东西,对于明显的二进制兼容性原因。

关于c# - 从返回 int 的非托管代码中获取外部函数是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14798276/

相关文章:

c# - 什么是更好的?静态方法或实例方法

python - 在 OSX 10.10 上链接 Boost Python

c++ - OpenMP 并行化时出现段错误

c++ - 用于跟踪或分析 C++ 控制台应用程序执行和差异跟踪的工具的建议

c# - 在 C# 中将 char * 编码到 StringBuilder

c# - C#通过P/Invoke一次播放多种声音

c# - .NET 框架的精简版

c# - Xml 验证错误根据其数据类型 'CopyFrom',该值无效 - 枚举约束失败

c# - 如何根据用户在 ASP.NET 中另一个下拉列表中的选择禁用下拉列表项?

c#:一般将非托管数组转换为托管列表