gpt4 book ai didi

c# - 正确使用 P/Invoke

转载 作者:可可西里 更新时间:2023-11-01 10:53:35 25 4
gpt4 key购买 nike

我需要从 C# 调用外部 dll。这是 header 定义:

enum WatchMode { 
WATCH_MODE_SYSTEM = 0,
WATCH_MODE_APPLICATION = 1 };

LONG ADS_API WDT_GetMode ( LONG i_hHandle, WatchMode * o_pWatchMode );

我在 C# 中添加了枚举和调用:

public enum WatchMode
{
WATCH_MODE_SYSTEM = 0,
WATCH_MODE_APPLICATION = 1
}
[DllImport("AdsWatchdog.dll")]
internal static extern long WDT_GetMode(long hHandle, ref WatchMode watchmode);

这会生成一个 AccessViolationException。我知道 dll 正在“工作”,因为我还添加了对 GetHandle 的调用,它返回上面提到的 hHandle。我试图将参数更改为 int (ref int watchmode) 但得到相同的错误。有谁知道我如何 PInvoke 上面的调用?

最佳答案

您遇到了 C# 和 C++ 之间的参数大小问题差异。在 C++/windows 世界中,LONG 是一个 4 字节的有符号整数。在 C# 世界中,long 是一个 8 字节的有符号整数。您应该更改您的 C# 签名以采用 int。

ffpf 说你应该在这里使用 IntPtr 是错误的。它将在 32 位机器上解决这个特殊问题,因为 IntPtr 将编码为 int。如果您在 64 位机器上运行它,它将再次编码为 8 字节有符号整数并会崩溃。

关于c# - 正确使用 P/Invoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/148856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com