日期:2014-05-17  浏览次数:20909 次

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文件,你添加上那个文件后重新生成看怎么样