C#调用C语言的dll问题

superyanghua 2010-05-25 10:23:57
在C#里面调用一个用C语言写的dll,如果是用C去调用是这样的:
char str[256];
strcpy(str,"`hello!");
a = (long)str;
在C#里面不能直接这么用,我把C代码封装成unsafe段,还是解决不了。
unsafe
{
char str[256];
strcpy(str,"`hello!");
a = (long)str;
}
不知道是用的不对还是这个方法压根行不通。请高手指点,在线等待。谢谢。
...全文
156 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
superyanghua 2010-05-26
  • 打赏
  • 举报
回复
再次谢谢大家
superyanghua 2010-05-26
  • 打赏
  • 举报
回复
这个问题已经解决,还是采用了P/invoke方法,在这个方法里,有个参数:在C语言中如果传递的参数是字符串数组的指针,那么在C#中声明时要用MarshalAs属性。具体代码如下:
C代码:
char str[256];
strcpy(str,"`01红`02绿`03黄");
ShowString(*, *, *, *, (long)str);
C#:
声明: unsafe static extern bool ShowString(*, *, *, *, [MarshalAs(UnmanagedType.LPStr)] string m);
调用: unsafe
{
string str1 = "`01再见!";
ShowString(*, *, *, *, str1);//
}
harderLi 2010-05-25
  • 打赏
  • 举报
回复
用pinvoke
加油馒头 2010-05-25
  • 打赏
  • 举报
回复
一般两种 方式 pinvoke
dllimport
superyanghua 2010-05-25
  • 打赏
  • 举报
回复
未处理的“System.AccessViolationException”类型的异常出现在 StaffManagement.exe 中。

其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
superyanghua 2010-05-25
  • 打赏
  • 举报
回复
unsafe了,编译没有问题,运行过程中出错,提示:不能访问该内存,或者该内存已损坏。
yuanhuiqiao 2010-05-25
  • 打赏
  • 举报
回复
用指针,还是得Unsafe啊
superyanghua 2010-05-25
  • 打赏
  • 举报
回复
上面的工作已经完成。现在是dll里有个函数,他的一个参数是指针型,指向一个数组的起始地址。而现在C#里面无法用指针,定义一个数组,然后使用首地址的话,编译没有问题,但是执行有问题。
oncesky 2010-05-25
  • 打赏
  • 举报
回复
要DllImport,指定ddl文件名和EntryPoint ,调用非托管函数的外部方法
捷哥1999 2010-05-25
  • 打赏
  • 举报
回复
使用PInvoke实现:

创建Win32 DLL,并在C#里面调用
http://blog.csdn.net/tangl_99/archive/2006/09/06/1182354.aspx
superyanghua 2010-05-25
  • 打赏
  • 举报
回复
楼上的好快,呵呵.在C# 里面一个按钮里.关于dll已经引入了。
wcl1988 2010-05-25
  • 打赏
  • 举报
回复
在哪调用的?注意C#与C语言之间类型的对应
hualoveqi 2010-05-25
  • 打赏
  • 举报
回复
添加引用!
soaringbird 2010-05-25
  • 打赏
  • 举报
回复
把你C#里的代码贴上来,别贴伪代码
superyanghua 2010-05-25
  • 打赏
  • 举报
回复
用了pingvoke,好像还是不行啊,不知道是不是用错了?

111,119

社区成员

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

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

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