C#中调用C++写的DLL注意事项
来源:互联网 发布:ubuntu 16.04 selinux 编辑:程序博客网 时间:2024/05/17 00:07
最近在写毕业设计,硬件模块儿的功能都封装到Dll里面了,当初想C#调用Dll也不一样easy(c#就看了一天就开始做了),可是等到该使用的时候发现了问题,结构体...就是这个,因为要传递结构体数组,结果死活是搞不定,只是能得到一组数据。试了网上的很多方案,包括IntPtr这些,可是仍不行,就这样折腾了三四天,其实这三四天里面一直想把结构体单独拿出来,做Demo测试可一直存着侥幸心理,没下手做。今天实在是受不了就安心做,把结构体的成员逐渐增加,这样试,嘿嘿,最终还是给让我发现了问题,MD,有个小结构体的字节没对齐。对齐之后就OK了,demo上能跑了。
1.如果c++生成的DLL需要被C#调用,那么在c++的结构体中,字符串应用char(WCHAR)类型,避免使用stirng,CString,在C#中声明这个结构的时候,对应的使用string类型但是必须指明string的长度。
2.如果被调用的函数中需要传递结构体指针,在c#中声明函数的时候加上out或者ref标志,如果要传递的是结构体数组,在这种情况下,如果结构体中并不包含其他的结构体或者包含的结构体的字节是对齐的,那么声明函数的时候加上[In,Out]即可。
如果被包含的结构体字节是未对齐的就无法得到正确结果。(字节对齐的可g.cn)
补充下关于字符串操作的:
3.如果需要从Dll中返回单个字符串,用如下调用方式
C#:
Dll:
void StrTest1(WCHAR* str);
4.如果需要从Dll中返回字符串数组,用如下调用方式(暂时想到用结构体封装的方式)
c#:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
[DllImport("PInvokeDll.dll", SetLastError = true , CharSet=CharSet.Unicode)]
public static extern void StrTest2([In,Out]struct4[] str , int len);
DLL:
struct struct4
{
};
void StrTest2(struct struct4* str , int len);
文献来源于:http://blog.sina.com.cn/s/blog_6f9f12990100q6d0.html
- C#中调用C++写的DLL注意事项
- C#调用C++DLL注意事项
- C#中调用C++写的DLL
- C#写的dll,C#中如何调用
- 在C#中调用C语言写的动态链接库 DLL
- C#下调用C写的dll的例子
- C#调用C写的DLL二级指针传递方法
- C#调用C写的DLL二级指针传递方法
- 在C#中调用C++写的DLL
- C#中调用其他语言写的DLL
- C#中调用C++写的dll文件
- 怎样在C#中调用Delphi6写的DLL
- 在C++ 中 如何调用 C# 写的DLL
- 在C#中调用C++写的DLL
- 在C++ 中 如何调用 C# 写的DLL
- C#调用C++接口\C接口小结总结(C#调用C++写的DLL总结)
- C#调用C的DLL
- 在C#中使用C/C++写的DLL
- Ofbiz10.04改用mysql数据库配置
- 【Qt开发】Qt中的中文字符问题
- c# 调用 研华库函数中 C++ 非托管 Dll 一例(包含指针成员的结构体的调用)
- poj 1950
- Win7安装VS2008 SP1卡在 VS90sp1-KB945140-X86-CHS 的解决方法
- C#中调用C++写的DLL注意事项
- asp.net sitemappath站点地图
- uva-10010 - Where's Waldorf?
- 预处理
- Struts2学习笔记(十四) 输入校验(下)
- 创建Eclipse Editor
- jQuery插件AjaxFileUpload
- 淘宝店铺装修收藏链接代码
- 根据字典排序找到下一个由n个不同字符组成的序列