我想从标准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();
}
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();
}
解决方案 »
- 使用SHGetFileInfo 获取文件大图标的问题
- 请问几个工程直接怎么实现数据共享?
- datgridview控件combobox联动出现DataGridViewComboBoxCell值无效的问题。
- 数字、字符串转化问题
- 急!!!!Sqlsever 中关于DataRow的问题!!
- NHibernate中配置文件设置数据库连接串,我写的为什么不行呀,请大虾帮助我
- 求VS.NET的下载地址!
- TCP服务端连接线程达到1300的时候出现内存溢出错误
- 请问如何在DataGridTextBox中捕获到回车事件?用Key_Down不行!
- 我想在C#开发的Web Services中调用VB.net写的一段程序,应该如何调用啊?
- 正则表达式与编码的问题.
- C#编写的应用Windows程序,怎么给别的电脑运行?(有.net Framework环境)
标准DLL的规则是接口中没有任何关于class的东西你要是用C++/CLR返回一个托管的类还是可以调用的
即使你在C#中也定义了一个类 C
能够匹配的也就只有简单数据类型
参考这个
http://dev.csdn.net/develop/article/28/28164.shtm
{
public IntPtr arr;
}使用的时候用Marshal.Copy(IntPtr, array<Double>[]()[], Int32, Int32)
复制到托管数组
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;
}
}
1) 使用unsafe方式,可以操作c++代码,但是会对.net平台有安全性方面的影响.
2) 使用c++/cli对于原来的代码做个重新封装,让它们可以工作在.net平台上,就是形成托管类,这样恐怕加重了一部分工作量.
3) 最后一种方式,如果c++代码不是很大量的话,可以把它封装成com组件,然后再给.net平台来调用,这样的代码工作量最大,但是平台调用,将不是问题.