【发布时间】:2011-10-20 23:10:12
【问题描述】:
我需要从 C# 进入 C++ 并带回一个结构的二维数组。我已经设置好了所有东西,如果我附加了一个调试器,一切似乎都正常,除了我的 2D 数组没有正确编组。如果我在调用本机方法之前用值加载它,然后从本机端查看数组,我会在 VS 的监视窗口中得到很多“无效”指针。然后 C++ 代码继续执行并加载带有值的数组就好了,但是在封送回 C# 期间,我遇到了内存访问冲突。
我宁愿不把它作为一维数组来做。
这是我的 C++ 结构和方法定义:
struct DoubleStringStruct
{
BSTR Value;
BSTR NumberFormat;
};
HRESULT WINAPI NativeArrayHandler(LONG rMax, LONG cMax, DoubleStringStruct** values)
{
for(LONG rn=1; rn <= rMax; rn++)
{
for (LONG cn = 1; cn <= cMax; cn++)
{
DoubleStringStruct s;
s.Value = _wcsdup(L"Test");
s.NumberFormat = _wcsdup(L"Test");
values[rn][cn] = s;
}
}
return S_OK;
}
还有我的 C# 代码:
[StructLayout(LayoutKind.Sequential)]
public struct DoubleStringStruct
{
[MarshalAs(UnmanagedType.BStr)]
public string value;
[MarshalAs(UnmanagedType.BStr)]
public string numberFormat;
}
[System.Runtime.InteropServices.DllImport(c_dllName)]
public static extern void NativeArrayHandler(int hMax, int cMax, DoubleStringStruct[,] args);
public void sometMethod()
{
DoubleStringStruct[,] someDSS= new DoubleStringStruct[4,3];
NativeArrayHandler(4, 3, someDSS);
}
【问题讨论】:
-
FWIW - 我注意到在本机代码中,数组大小参数正确传递。
-
尝试使用数组数组 (
[][]) 而不是多维数组 ([,]),看看是否可行。 -
嗯...直到我看到这个人,我才认为这是可能的,但我希望能有更多“自动”的东西stackoverflow.com/questions/6327196/…
标签: .net marshalling