c# 调用 c语言的DLL 参数是char * 的问题
最近我要调一个C语言的DLL 调用时总是报错“外部组件发生异常” SEHException类型的错误
C语言的.h文件里这样定义的
extern "C" _declspec(dllexport) int VerifyLicense(
const char* publicKey,
const char* dat,
const char* lic);
我C#里是这么写的
[DllImport("licverif.dll", EntryPoint = "VerifyLicense", CharSet = CharSet.Ansi)]
public static extern int VerifyLicense(string publicKey, string dat, string lic);
dll名字我肯定没写错,否则会报“找不到指定模块”的异常
我上网搜了一遍,char*这个参数对于C#来说比较麻烦,我还试过StringBuilder,char[],IntPtr,byte[]都不行,悲剧
求大家帮助
------解决方案--------------------是C++内部执行出错了吧
每个字符串后面加个结尾符'\0'试下:
publicKey += "\0";
dat+= "\0";
lic+= "\0";
------解决方案--------------------对于char*,你可以尝试对应的参数类型为byte[]试试
------解决方案--------------------无法直接定性,有这个函数的参数描述吗,或是 C/C++ 调用示例?
------解决方案--------------------不是让你转,是在dll接口的地方和C++的dll方法参数对应起来
------解决方案-------------------- #region 添加IP,端口
/// <summary>
/// 添加IP,端口
/// </summary>
/// <param name="strIP"></param>
/// <param name="lPort"></param>
[DllImport("ClientSDK.dll", CharSet = CharSet.Ansi, EntryPoint = "_AddLoginAgent@8")]
public static extern void AddLoginAgent(byte[] IP, int Port);
#endregion
EntryPoint 的值由depends打开C++dll看看具体是什么,就写什么
------解决方案--------------------这里的IP就是定义的Char*
------解决方案--------------------你调用的时候当然是byte[],这玩意儿是通用的,你想怎么转都可以。如果你直接使用string作为参数,由于C#和C++的定义机制不同,可能会错位,最后导致你得到的不是你想要的东西
byte[]转成string。使用Encoding.defalut.getstring(byte[] buff)
------解决方案--------------------想当初搞这玩意儿,C++一long类型,到我这边,我定义为long类型,郁闷了好久
------解决方案--------------------
缺少这个几个DLL吧
位于目录“C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT”
你让你同事拷给你放在应用程序目录下
------解决方案--------------------出现这个问题的原因可能是你的的导出DLL工程中没有def文件,你添加上那个文件后重新生成看怎么样