【发布时间】:2011-11-10 17:03:02
【问题描述】:
我有以下 C# 代码,其中包含结构定义 (CInput)、obj 定义和 init,以及对 C++(本机)DLL 函数(也是我编写的)的调用。
//C# code
public struct CInput
{
[MarshalAsAttribute(UnmanagedType.R8)]
public double Time;
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_R8)]
public double[] Database;
/* other similar fields*/
}
CInput Inputs = new CInput();
/* init of Inputs fields*/
int bfr = Example(ref Inputs); //'Example' being the C++ DLL call
Messagebox.Show(bfr.ToString());
第二个参数的marshaling有错误,不知道在哪里。那么:
//C++ code
struct CInput {
double Time;
double Database[3650];
/*etc*/
}
int Example(CInput& ObjIn) {
return ObjIn.Database[0]; // just an example
}
如果我不小心并在数据库封送处理中仅指定“SafeArray”,我会收到“读/写内存错误,可能已损坏”等。
如果“数据库”被封送为 ByValArray 一切正常,则值会正确显示。不幸的是,我得到了一个内部大小异常,因为我有很多该大小的数组,因此我必须使用指针 - 但是任何带有“SizeArray”的东西都会带来以下结果(刚刚发布的代码):
(来自 C++):
Database[0] = **0**
Database[1..etc] = values of the next parameters in the struct marshaled with ByValArray.
我想我应该提一下,我需要从 C# 到 C++ 的相同结构,我不是在寻找任何花哨的东西。所以 Struct 中的数组 >>> Struct 中的数组。
任何对此的见解将非常有价值。我一直在寻找几个小时,但我还没有解决方案。
非常感谢。
【问题讨论】:
-
UnmanagedType.SafeArray仅对 COM 代码有用。对应类型为SAFEARRAY,由COM Array functions管理
标签: c# c++ pinvoke marshalling