当前位置:  开发笔记 > 编程语言 > 正文

正确使用P/Invoke

如何解决《正确使用P/Invoke》经验,为你挑选了1个好方法。

我需要从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)但得到相同的错误.没有人知道我怎么能拨打上述电话吗?



1> JaredPar..:

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

ffpf说你应该在这里使用IntPtr是错误的.它将在32位机器上修复此特定问题,因为IntPtr将作为int封送.如果你在64位机器上运行它,它将再次编组为8字节有符号整数并将崩溃.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有