C++中的函数的源代码如下:
struct  DYNAMICDLL_API cdp_tree1
{
int  count;
CString DeviceID;
CString Addresses;
CString PortID;
CString platform;
} ;
int libmyethereal::testsum(int a,int b,int *outnum, cdp_tree1 *cdptree1)
{ int c=0;
c=a+b;
*outnum=356;
  cdptree1[0].count=356;
     cdptree1[0].DeviceID="abc";
cdptree1[0].Addresses="dfg";
cdptree1[0].platform=123;
cdptree1[0].PortID="aaa";

    cdptree1[1].count=444;
    cdptree1[1].DeviceID="fgh";
cdptree1[1].Addresses="dfg";
cdptree1[1].platform=123;
cdptree1[1].PortID="aaa";
..... return c;}
c#中调用时的代码如下,        public struct mycdptree
        {
            public int count;
            public String DeviceID;
            public String Addresses;
            public String PortID;
            public String platform;
        };        [DllImport("libmyeth.dll", EntryPoint = "?testsum@libmyethereal@@QAEHHHPAHPAUcdp_tree1@@@Z", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
        public static extern int testsum(int a, int b, ref int outnum ,out  mycdptree[] cdptree1);
private void button1_Click(object sender, System.EventArgs e)
{
.....
             int c=-1;
             mycdptree[] cdptree2= new mycdptree[3];
                           for (int i = 0; i < 3; i++)
             {
                 cdptree2[i].count = 3;
                 cdptree2[i].DeviceID = "12";
                 cdptree2[i].platform = "11";
                 cdptree2[i].PortID = "13";
                 cdptree2[i].Addresses = "13";
             }            cdptree[]  cdptree1=new cdptree[1];
              int num=0 ;
//            for(int i=0;i<3;i++)
               c = testsum(3, 300,ref num, ref cdptree2[0]);问题:怎么才能把cdptree2数组中的三个对象的值都改变了,急求!!

解决方案 »

  1.   

    C++ 的类 .net 中用#import方式
      

  2.   

    不需要 ref 数组本身就是引用类型的关键只要对应好相应的字节长度,(Mash1......)
      

  3.   

    .net 下无法直接调用c++的类函数
      

  4.   

    你肯定不对
    c++的类函数,在编译后第一个参数是指向this的指针,与你声明的函数不一致
    改为static函数试试
      

  5.   

    建议改为C格式,不要在参数中使用c++的东西。补充如果参数为char *,C#使用stringbuilder比较方便
      

  6.   

    CString都用了,相信你不会调用成功的.
      

  7.   

    hdt都出现了。瞻仰一下。我觉得他说的很有道理。你的dll里不可以适用CString做成员变量的,要知道字符串的处理在每种语言里都有自己的方法,方法不同。存储的也不同。CString就不能直接的认为是char[]。你不可以用MFC的类,要用char[]或者char*或者BSTR之类的。
      

  8.   

    两个结构形似但实际上不一样的。C++中的结构使用#pragma pack(1),用1个字节对齐,可以使结构类似字符数组,但成员里用了CString,就麻烦了,他是MFC类。所以你的情况只能使用#import方式或者再包装一层(用C++读取结构数据然后再以合理的数据类型传递给C#调用)
      

  9.   

    有谁能给我个类似了例子啊,
    C++中的函数的源代码如下: 
    struct cdp_tree1 

    int count; 
    CString DeviceID; 
    CString Addresses; 
    CString PortID; 
    CString platform; 
    } ; 
    int testsum(int a,int b,int *outnum, cdp_tree1 *cdptree1) 
    { int c=0; 
    c=a+b; 
    *outnum=356; 
    cdptree1[0].count=356; 
    cdptree1[0].DeviceID="abc"; 
    cdptree1[0].Addresses="dfg"; 
    cdptree1[0].platform=123; 
    cdptree1[0].PortID="aaa"; cdptree1[1].count=444; 
    cdptree1[1].DeviceID="fgh"; 
    cdptree1[1].Addresses="dfg"; 
    cdptree1[1].platform=123; 
    cdptree1[1].PortID="aaa"; 
    ..... return c; } 
    c#中调用时的代码如下,         public struct mycdptree 
            { 
                public int count; 
                public String DeviceID; 
                public String Addresses; 
                public String PortID; 
                public String platform; 
            };         [DllImport("libmyeth.dll", EntryPoint = "?testsum@libmyethereal@@QAEHHHPAHPAUcdp_tree1@@@Z", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] 
            public static extern int testsum(int a, int b, ref int outnum ,out  mycdptree[] cdptree1); 
    private void button1_Click(object sender, System.EventArgs e) 

    ..... 
                int c=-1; 
                mycdptree[] cdptree2= new mycdptree[3]; 
                c = testsum(3, 300,ref num, ref cdptree2[0]); 
    有谁能给我一个类似的例子,定重谢!!!!!!!!!!!
      

  10.   

    这是我在另外一个贴子中的解释,(怎么把vc++里面的cstring转换为C#中的string 或int float )。1、VC编译器知道CString的结构和类信息,并在CString超出作用域的地方,插入CString的析构函数。 
    2、但C#并不知道CString的具体实现,不知道如何把CString转换为C# string,也不会析构CString。 
    3、即使通过一些偏移量硬从CString得到内部的string,也很容易造成内存的泄漏。 
    4、其实就是都用C++,不用版本的CString也会造成麻烦。