C#调用C语言的DLL

l_yy__ 2015-02-13 11:27:48
C#调用C语言实现的DLL时,出现CoTaskMemFree(IntPtr ptr ) 的错误,查了一下,感觉是参数没有对应上,哪位大侠帮我看看是哪里的问题好吗,跪谢~

C语言被调用代码:
test.dll
__declspec(dllexport) char* fun(DWORD mode,const char* password);
char* fun( DWORD mode, const char* password);

C#调用侧代码:
static String code;
[DllImport("test.dll", CharSet = CharSet.Ansi)]
public static extern String fun(int mode, String password);

static void Main(string[] args)
{
String s = "123";
code = obl_crypto_hash(5, s);
}
...全文
145 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
kenfinal 2015-02-13
  • 打赏
  • 举报
回复
修正一下DWORD在C++是定义为 unsigned long(32位无符号整型) 所以在C#里面应该对应是System.UInt32
kenfinal 2015-02-13
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
DWORD=double word 你应该使用long型,而不是int型
double word表示2个字,即4字节,32位, C#中int就是32位,而long在C#中表示64位
於黾 2015-02-13
  • 打赏
  • 举报
回复
DWORD=double word 你应该使用long型,而不是int型
l_yy__ 2015-02-13
  • 打赏
  • 举报
回复
谢谢github_22161131,果然是返回值类型的问题,用了INTPtr就好了,已经给分。 谢谢Z65443344 ,kenfinal 帮助分析,我没有多少分,匀着给你们了~~
winnowc 2015-02-13
  • 打赏
  • 举报
回复
默认c使用__cdecl的调用约定,需要DllImport里面设置CallingConvention属性为CallingConvention.Cdecl。 返回char *当作string的话,.net会认为它应该是通过CoTaskMemAlloc分配的,并且应该由.net释放。你看到的错误就是试图释放这个内存时产生的。所以如果要返回不是CoTaskMemAlloc分配的的或者不希望释放的char *,那么应该使用IntPtr作为返回类型,然后使用 Marshal.PtrToStringAnsi (如果确定使用ansi方式) 来转换成string。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧