目的是为了通过非托管函数处理字符串,然后返回处理结果!原函数:extern "C" void __declspec(dllexport) Test(char* testData ,char* testDAta1)
{
testData = "ABCDEFG!";
         testData1 = "POIUYT"!
}
C#调用:[DllImport("GprsApplication.dll", EntryPoint = "Test")]
        public static extern void Test(ref StringBuilder a ,ref StringBuilder b);
 private void button_Test_Click(object sender, EventArgs e)
        {
            StringBuilder a = new StringBuilder("12345");
 StringBuilder a = new StringBuilder("67890");
            Test(ref a , ref b);
            label.Text = a.ToString();
        }错误结果 :a和b的值还是“12345”和“67890”。而我希望应该是“ABCDEFG”和“POIUYT”。

解决方案 »

  1.   

    为什么用 StringBuilder ,换成string??
      

  2.   


    StringBuilder换成string
    1、数值型直接用对应的就可。(DWORD -> int , WORD -> Int16)
     2、API中字符串指针类型 -> .net中string
     3、API中句柄 (dWord)  -> .net中IntPtr
     4、API中结构   -> .net中结构或者类。注意这种情况下,要先用StructLayout特性限定声明结构或类
      

  3.   

    up下来试试看!--------------------各位,为啥StringBuilder就不行呢?
      

  4.   

    换成string.地址转换的问题,StringBuilder存储的开始不是字符串的开始.
      

  5.   

    extern "C" __declspec( dllexport ) int  void(char * temp1,char * temp2)
    {
    sprintf(temp1,"");
    sprintf(temp2,"");
    }调用时,只要用StringBuilder申明对象就可以了,不用ref(测试通过)
      

  6.   

    主要是dll中的函数写的不对,如果按照这种写法,就不能用stringbuilder,用intptr或许更合适。如果要用stringbuilder,修正的方法是用strcpy来修改char*的值
      

  7.   

    你的C++代码只是把两个指针指向新的字符串,原先的字符串没有改变。extern "C" void __declspec(dllexport) Test(char* testData ,char* testDAta1)
    {
             strcpy(testData, "ABCDEFG!");
             strcpy(testData1, "POIUYT");
    }