我想从标准c++写的dll中的一个类中拿到一段数据,这段数据是new出来的,大小已知但不固定。下面是我写的一段例子代码,但总是会抛出异常。不知道有没有什么好的写法,谢谢了。  ********************************c# code:********************************
  
  class Program
    {
        static void Main(string[] args)
        {
            C c = classTest();
            double b = c.array[0];
             
        }
        [DllImport("..//test.dll", CharSet = CharSet.Auto)]
        public static extern C classTest();
    }
     [StructLayout (LayoutKind.Sequential)] 
    class C
    {  
        public double[] array ;
    }}********************************c++ code:********************************class C
{public:
C(){
  array = new double[1];//这块数组的大小并不是写死的。
  array[0] = -1;
  }
double *array;
};
extern "C" __declspec(dllexport)  C* classTest(void)
{
return new  C();
}

解决方案 »

  1.   

    不用想了,这样的做法成功率接近0.
    标准DLL的规则是接口中没有任何关于class的东西你要是用C++/CLR返回一个托管的类还是可以调用的
      

  2.   

    肯定行不通的  因为C#中没有相匹配的类型 也就是C这个类 
    即使你在C#中也定义了一个类 C
    能够匹配的也就只有简单数据类型
    参考这个
    http://dev.csdn.net/develop/article/28/28164.shtm
      

  3.   

    你那是一个指针不是数组你要是当结构体用的话.public struct C
    {
    public IntPtr arr;
    }使用的时候用Marshal.Copy(IntPtr, array<Double>[]()[], Int32, Int32)
    复制到托管数组
      

  4.   

    [DllImport("..//test.dll", CharSet = CharSet.Auto)] 
            public static extern IntPtr classTest(); 
    或者unsafe public static extern void* classTest();unsafe class C
    {
      public C(){ 
      array = new double[1];//这块数组的大小并不是写死的。 
      array[0] = -1; 
      } 
      public double* array;
    }
    void slkdflsdls()
    {
      unsafe
      {
       C* c = (C*)classTest();
       c->array[0] = 1.0;
       c->array[1] = -1.0;
      }
    }
      

  5.   

    嗯,我就用unsafe指针了,我觉得这样最方便了,谢谢大家
      

  6.   

    我想可能会有几种办法,一起探讨:
    1) 使用unsafe方式,可以操作c++代码,但是会对.net平台有安全性方面的影响.
    2) 使用c++/cli对于原来的代码做个重新封装,让它们可以工作在.net平台上,就是形成托管类,这样恐怕加重了一部分工作量.
    3) 最后一种方式,如果c++代码不是很大量的话,可以把它封装成com组件,然后再给.net平台来调用,这样的代码工作量最大,但是平台调用,将不是问题.