C#调用C++DLL库常见问题
2013-10-30 14:09
253 查看
1、数据类型转换
C++ C#1)BOOL bool
2)char*(输入) string
3)char*(输出) stringBuilder
2、函数调用导致堆栈不对称,原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配
改 [DllImport("winmm.dll", EntryPoint = "sndPlaySoundA",)]static extern bool sndPlaySoundA();
为[DllImport("winmm.dll", EntryPoint = "sndPlaySoundA", CallingConvention = CallingConvention.Cdecl)]
static extern bool sndPlaySoundA();
转载自:/article/8412256.html
以下例子是我用C#调用VC dll中的函数的声明及使用方法:
1、using System.Runtime.InteropServices;//使用dll动态库和API函数必需
2、引入函数:
[DllImport("PmacNc.dll", CharSet = CharSet.Ansi)]
public static
extern
int GetResponse(StringBuilder com_response, System.UInt32 maxchar, System.Char[] sendChar);
C#调用VC dll输出参数的注意事项
1.CharSet要使用Ansi,因为Vc默认是Ansi的,而c#是Unicode,两者不统一会产生乱码。还有其他DIIImport的其他参数如下,除了EntryPoint,其他三个都是非必要的。
EntryPoint: 指定要调用的 DLL 入口点。默认入口点名称是托管方法的名称 。
CharSet: 控制名称重整和封送 String 参数的方式 (默认是UNICODE)
CallingConvention指示入口点的函数调用约定(默认WINAPI)
SetLastError 指示被调用方在从属性化方法返回之前是否调用 SetLastError Win32 API 函数 (C#中默认false )
2.结构体的引用传递
首先在c#中定义和c++相同的结构体,如果是引用传递,在结构体前面加上[In, Out],如:
[DllImport(@"test.dll")]
public static extern int test([In, Out] SLineData[] lndt,ref UInt32 length);
3.如果遇到char**类型的输出参数也就是指针的指针,或者二维数组或其他更复杂的情况。可以参考以下网页:
http://www.cppblog.com/kerlw/archive/2007/06/27/27061.html?opt=admin http://www.ixpub.net/viewthread.php?tid=810850
相关文章推荐
- C# 调用 C++ dll 函数 时传递字符串 需要注意的问题(zz)
- 用VS2008生成C++代码的dll及在C#中的调用及常见的类型转换
- 在c#里调用C++的dll时,需要注意的一些问题
- C#调用C++版本dll时的类型转换要注意的问题
- c# 调用c/c++ dll 参数问题
- C#调用C++DLL时遇到的PInvoke 函数的调用导致堆栈不对称问题
- 在c#里调用C++的dll时,需要注意的一些问题
- C#中调用C++dll错误问题
- C#.NET常见问题(FAQ)-如何将cs文件编译成dll文件 exe文件 如何调用dll文件
- 【windows8开发】回复g10589119提出的问题(c#调用C++/CX dll)
- Unity C# 调用C++ dll 问题集锦
- C# 调用C++dll出现的问题。
- C#调用C++Dll封装时遇到的一系列问题
- C#调用C++Dll封装时遇到的一系列问题
- C#调用C++下Win32DLL,找不到入口问题,感谢TallMan
- C# 调用 C++ 写的Dll 遇到的问题(调用DLL 自动退出) win32已停止工作
- 【windows8开发】回复g10589119提出的问题(c#调用C++/CX dll)
- c#程序调用c++编写dll需要注意问题
- C/C++/C#问题记录(一)VS2012编译调用dll项目找不到lib的workaround
- 关于c#调用c++ dll 的一些问题和解决方案