【问题标题】:C# equivalent for C++ "signed long int"C# 等效于 C++“signed long int”
【发布时间】:2011-03-24 14:53:21
【问题描述】:

我将 C++ dll 导入到 C# 项目中,在 x64 机器上,在调试模式下,PInvoke 抱怨托管签名与非托管目标签名不匹配。

C++:

void _Foo(signed long int x);

C#:

[DllImport("foo.dll", EntryPoint="_Foo"]
public static extern void Foo(int x)

将 C# 代码中的 int 替换为 IntPtrInt64 并不能解决问题。 有什么建议吗?

【问题讨论】:

  • pinvoke 的确切错误是什么?我认为您在这里问错了问题(我回答了您提出的问题,但对您没有帮助)。
  • 正是拉里,我有一个类似的答案,但被标记了。 >:(
  • 我最好的猜测是这实际上是编译为 32 位的。 EntryPoint 属性是错误的,它是 __Foo(两个下划线)。 CallingConvention 也不见了。没有发布确切的错误消息是一个错误。

标签: c# marshalling managed


【解决方案1】:

它是 System.Int32。也称为“int”。

【讨论】:

  • 是的,我读到了问题的一部分,说 pinvoke 抱怨签名不匹配。如果它抱怨,它不是在抱怨“int”部分。
  • 否 - C#“long”类型是 System.Int64。但他询问了 C++ long 类型,它是一个 32 位数字(在大多数 32 位操作系统和所有 Windows 系统上)。
【解决方案2】:

C++ 中的 long int == C# 中的 int。两者都是 4 字节长。 C++ 中的 long long == C# 中的 long。 (8 个字节)。

正如上面的拉里所说,如果它发现类型不匹配,那不是因为 int。

【讨论】:

  • 为什么这个被降价了?!它陈述了事实,并指出了与原始海报所假设的问题不同的问题。降价应附有强制性评论。太令人沮丧了。
  • 我开始了 :)。不得不走出办公室。这是因为您过分热心地声称在 C++ 中 long int 的长度为 4 个字节。不是这种情况。除非您将特定平台附加到这些数字,否则此答案不是“事实”并且确实是错误的。
  • 奇怪我总是假设它总是一样的。找不到任何反对这一点的证据,但确实找到了 jk-technology.com/c/inttypes.htmlmsdn.microsoft.com/en-us/library/s3f49ktz(v=VS.100).aspx,它们都将 long int 定义为 4 个字节。
  • 如果您具体谈论的是 MSDN 上记录的 MS 的 C++ 编译器,那么您的说法是正确的。如果您笼统地说“C++”,那您就错了。你只需要更多的特异性。
  • 另一个文档没有指定它所谈论的目标平台。我搜索过的各种其他资源也没有指定特定的平台,但我会向你的更多知识低头,我是一名 .Net 开发人员,只与 C++ 有过短暂的交集。也许您可以引用一些说明跨平台类型差异的文档?
猜你喜欢
  • 1970-01-01
  • 2011-05-08
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多