正确使用P / Invoke

我需要从C#调用外部DLL。 这是标题定义:

enum WatchMode { WATCH_MODE_SYSTEM = 0, WATCH_MODE_APPLICATION = 1 }; LONG ADS_API WDT_GetMode ( LONG i_hHandle, WatchMode * o_pWatchMode ); 

我在C#中添加了enum和call:

 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提到的hHandle 。 我试图改变参数为intref int watchmode ),但得到相同的错误。 没有人知道我可以如何PInvoke上述电话?

Solutions Collecting From Web of "正确使用P / Invoke"

你遇到了C#和C ++之间的参数大小问题的区别。 在C ++ / windows世界LONG是一个4字节的有符号整数。 在C#世界中,long是一个8字节的有符号整数。 你应该改变你的C#签名采取一个整数。

ffpf在说你应该在这里使用一个IntPtr是错误的。 它将在32位机器上解决这个特定的问题,因为IntPtr将作为一个整型。 如果你在一个64位的机器上运行它,它会重新编组为8字节的有符号整数,并且会崩溃。

Managed,Native和COM Interop团队在codeplex上发布了PInvoke Interop Assistant。 也许它可以创建适当的签名。 http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120