正确使用P /调用

时间:2020-03-06 14:52:34  来源:igfitidea点击:

我需要从C#调用一个外部dll。这是标头定义:

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),但得到相同的错误。有谁知道我该如何调用上面的电话?

解决方案

我们正在碰到Cand C ++之间的参数大小问题。在C ++ / windows世界中,LONG是一个4字节有符号整数。在Cworld中,long是一个8字节有符号整数。我们应该更改自己的CSignature以获取整数。

ffpf的错误之处在于我们应在此处使用IntPtr。由于IntPtr将封送为int,因此它将在32位计算机上解决此特定问题。如果在64位计算机上运行此命令,它将再次封送为8字节有符号整数,并且将崩溃。

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