最近我要调一个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[]都不行,悲剧求大家帮助

解决方案 »

  1.   

    是C++内部执行出错了吧每个字符串后面加个结尾符'\0'试下:
    publicKey += "\0";
    dat+= "\0";
    lic+= "\0";
      

  2.   

    对于char*,你可以尝试对应的参数类型为byte[]试试
      

  3.   

    刚试了下+"\0",还是不行。我调用别的dll  比如user32.dll 的某个方法就没事
    我现在无法排除 是我调用方法的问题 还是那个dll有问题谁给我来一个带char*参数的dll 我试试
      

  4.   

    byte[]我也试过了 
    我还特意做了一个string转byte[]的方法       private byte[] GetCharArray(string str)
            {
                byte[] array = new byte[str.Length + 1];            for (int i = 0; i < str.Length; i++)
                {
                    array[i] = (byte)str[i];
                }            array[str.Length] = 0;            return array;
            }还是不行啊
      

  5.   

    应该就是用string啊,CharSet不指定呢试试
      

  6.   

    不是让你转,是在dll接口的地方和C++的dll方法参数对应起来
      

  7.   

    CharSet不指定我之前也试过我同事拿C++调用这个DLL能出来
      

  8.   

     #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看看具体是什么,就写什么
      

  9.   


            [DllImport("licverif.dll", EntryPoint = "VerifyLicense")]
            public static extern int VerifyLicense(byte[] publicKey, byte[] dat, byte[] lic);是改定义接口这里吧,我改完这个,我调用的时候也得是byte[],要不编译通不过
      

  10.   

    你调用的时候当然是byte[],这玩意儿是通用的,你想怎么转都可以。如果你直接使用string作为参数,由于C#和C++的定义机制不同,可能会错位,最后导致你得到的不是你想要的东西byte[]转成string。使用Encoding.defalut.getstring(byte[] buff)
      

  11.   

    想当初搞这玩意儿,C++一long类型,到我这边,我定义为long类型,郁闷了好久
      

  12.   

    用depends打开这个dll后报了一个错,是不是这个dll会依赖某个dll,我现在没有那个dll,有这个情况吧
      

  13.   

    缺少这个几个DLL吧
    位于目录“C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT”你让你同事拷给你放在应用程序目录下
      

  14.   

    装了一遍vcredist_x86.exe  发现以前装过了 提示修复或卸载 又修复了一下
    然后depends还是问号的 然后我把msvcr90.dll从硬盘里搜出来了 放到了我那个dll旁边 再次用depends打开没问号了  
    但是我程序还是报那个错
      

  15.   

    出现这个问题的原因可能是你的的导出DLL工程中没有def文件,你添加上那个文件后重新生成看怎么样
      

  16.   

    找到原因了,dll内部的错误。用string传就行。那3个参数是文件的内容,我以为是文件的路径了
      

  17.   

    用 Stringbuilderstring 不行