c++ builder 中结构体的定义如下:
struct VaStr //变量结构体
{public:
  long VId;
  char *VName;
  char *VValue;
  char *VType;
  char *VDescrip;  //构造函数
  VaStr();  //拷贝构造函数
  VaStr(VaStr&);  //析构函数
  ~VaStr();
};
c++调用函数如下:
  
//获取所有变量的信息
extern "C" __declspec (dllexport) int __stdcall GetVariable(VaStr *PPVaStr,long length);
 

  请问c#中对应的代码怎么写?
   在网上找个很多,但都有很多问题。

解决方案 »

  1.   

    使用平台调用:
    1、结构体:
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct VaStr 
    {
        public  int       VId;         //注意long在C++是4个字节,在C#是8个字节
        public  string  VName;
        public  string  VValue;
        public  string  VType;
        public  string  VDescrip;
    }2、函数声明:
    [DllImport("xxxx.dll",CharSet=CharSet.Ansi, CallingConvention=CallingConvention.StdCall)]
    public static extern int GetVariable(ref VaStr PPVaStr,int length);
      

  2.   

    “使用你的方法,在c++调试中”,那是C#对应的声明,你怎么用到C++去了!!!
    你要用C#些代码测试
      

  3.   

    函数是在c++定义的,c#负责调用。
    在调用时向c++的函数传递 结构体的指针,我在c++函数中调试,想看看传的参数是否正确,结果出来那样的错误!
      

  4.   

    [url=http://][/url]
    如果你详细了解c++ builder 生成二进制编码中那个类的内存布局,还有可能调用,否则,算了吧
      

  5.   

    http://topic.csdn.net/u/20110915/10/ca1eb6ba-6ef9-4629-8817-b39cb887f0fa.html
      

  6.   


    我说的是:
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public struct VaStr 
    {
      public int VId; //注意long在C++是4个字节,在C#是8个字节
      public string VName;
      public string VValue;
      public string VType;
      public string VDescrip;
    }
    [DllImport("xxxx.dll",CharSet=CharSet.Ansi, CallingConvention=CallingConvention.StdCall)]
    public static extern int GetVariable(ref VaStr PPVaStr,int length);还有你的调用代码全部要在C#中!你把这些代码贴出,我来看看
      

  7.   

    我的c#代码如下:
    结构体声明:
    [StructLayout(LayoutKind.Sequential), CharSet = CharSet.Ansi]
        public struct VaStr
        {
            public int VId;
            //[MarshalAsAttribute(UnmanagedType.LPTStr)]
            public string VName;
           // [MarshalAsAttribute(UnmanagedType.LPTStr)]
            public string VValue;
            //[MarshalAsAttribute(UnmanagedType.LPTStr)]
            public string VType;
           // [MarshalAsAttribute(UnmanagedType.LPTStr)]
            public string VDescrip;
        }
    函数声明:
            /// <summary>
            /// 获取所有变量的信息
            /// </summary>
            /// <param name="PPVaStr">VaStr变量数组</param>
            /// <param name="length">数组长度</param>
            /// <returns></returns>
            [DllImportAttribute(DLL_NAME, CharSet = CharSet.Ansi, EntryPoint = "GetVariable", CallingConvention = CallingConvention.StdCall)]
            public static extern int GetVariable(ref VaStr[] PPVaStr, long length);函数使用:
         VaStr[] vaStrFromDLL = new VaStr[200];
         EcsHandle.GetVariable(ref vaStrFromDLL, 200);c++中函数定义如下:
       int __stdcall GetVariable(VaStr *PPVaStr,long length)
    {
      try
      {
          if(static_cast<unsigned long>(length)>AllVaVector.size())        length=AllVaVector.size();      int i;    //此次赋值时出现上面的错误
          for(i=0;i<length;i++)
          {
            PPVaStr[i].VId=(AllVaVector[i])->VId;        strcpy(PPVaStr[i].VName,(AllVaVector[i])->VName);        strcpy(PPVaStr[i].VValue,(AllVaVector[i])->VValue);        strcpy(PPVaStr[i].VType,(AllVaVector[i])->VType);        strcpy(PPVaStr[i].VDescrip,(AllVaVector[i])->VDescrip);
          }    }
      }
      catch(...)
      {
        return -1;
      }  return 1;}
      

  8.   

    楼主,你这样改改:
      [DllImportAttribute(DLL_NAME, CharSet = CharSet.Ansi, EntryPoint = "GetVariable", CallingConvention = CallingConvention.StdCall)]
      public static extern int GetVariable([In,Out]VaStr[] PPVaStr, long length);测试:
      VaStr[] vaStrFromDLL = new VaStr[1];
       
      vaStrFromDLL[0].VId =1;
      vaStrFromDLL[0].VName="aa";
      vaStrFromDLL[0].VValue="44";
      vaStrFromDLL[0].VType=""10;
      vaStrFromDLL[0].VDescrip="desc";
      EcsHandle.GetVariable(ref vaStrFromDLL, 1);先用一个数组测试,后面逐步加多!