DLL导出部分如下:
extern "C" __declspec(dllexport) int __stdcall Foo(char** szVar)
{
        //strcpy(*szVar, "123");                            //1
strcpy(*szVar, "123456123456123456123456123456");   //2
return 0;
}调用时声明部分如下:
public class Process {
    [DllImport("Process.dll", CharSet = CharSet.Ansi)]
    public static extern int Foo([MarshalAs(UnmanagedType.LPStr)]ref string szVar);
}调用时声明部分如下:
string strRet = "";
Process.Foo(ref strRet);
TextBox1.Text = strRet;上述//1不会出错,//2会出错,即C#调用DLL返回一个小字符串是不会出错,返回一个大字符串是会出错,不知道为什么?
哪位大侠帮看看啊,多谢~:)

解决方案 »

  1.   

    看样子是*szVar空间不够呀。
    看看c语言的内容。
      

  2.   

         char *buf[100]={""};
         Foo(buf);c++中的调用方法是
      

  3.   

    这个DLL如果是你写的,可以改一下DLL的函数,要一个*就可以了。extern "C" __declspec(dllexport) int __stdcall Foo(char* szVar)
    {
    strcpy(szVar, "123456123456123456123456123456"); //2
    return 0;
    }
    调用的时候最好用stringBuilder 
    public class Process {
      [DllImport("Process.dll", CharSet = CharSet.Ansi)]
      public static extern int Foo([MarshalAs(UnmanagedType.LPStr)]stringBuilder szVar);
    }
      

  4.   

    string strRet = "";
    替换为string strRet = new string('\0', 100);
      

  5.   

    将string改为StringBuilder后好一些
    但是当Dll改为如下时仍然出错extern "C" int _declspec(dllexport) __stdcall Foo(char** szVar)
    {
            for (int i=0; i<10; i++)               //1
    //for (int i=0; i<100; i++)            //2
    strcat(*packageName, "123456");
    return 0;
    }
    情况和之前类似//1时很少出错,//2经常程序崩溃
    大家可以验证下,有没有完美的解决方法啊?