元帅C++;int数组到C# 我想把一组从C++到C的嵌入式系统集合起来。我有一个非托管C++ DLL,包含: DLL_EXPORT int* fnwrapper_intarr() { int* test = new int[3]; test[0] = 1; test[1] = 2; test[2] = 3; return test; }

元帅C++;int数组到C# 我想把一组从C++到C的嵌入式系统集合起来。我有一个非托管C++ DLL,包含: DLL_EXPORT int* fnwrapper_intarr() { int* test = new int[3]; test[0] = 1; test[1] = 2; test[2] = 3; return test; },c#,c++,C#,C++,在headerextern“C”DLL_EXPORT int*fnwrapper_intar()中使用声明 然后我使用pinvoke将其编组为C#: 我使用这样的函数: int[] test = fnwrapper_intarr(); 但是,在程序执行期间,我遇到以下错误:SafeArray无法封送到此数组类型,因为它具有非零下界或多个维度。 我应该使用什么数组类型?还是有更好的方法来编组整数数组或向量? [DllImport("wrapper_demo_d.dll")] public sta

在header
extern“C”DLL_EXPORT int*fnwrapper_intar()中使用声明

然后我使用pinvoke将其编组为C#:

我使用这样的函数:

int[] test = fnwrapper_intarr();
但是,在程序执行期间,我遇到以下错误:
SafeArray无法封送到此数组类型,因为它具有非零下界或多个维度。

我应该使用什么数组类型?还是有更好的方法来编组整数数组或向量?

[DllImport("wrapper_demo_d.dll")] public static extern IntPtr fnwrapper_intarr(); IntPtr ptr = fnwrapper_intarr(); int[] result = new int[3]; Marshal.Copy(ptr, result, 0, 3); [DllImport(“wrapper\u demo\u d.dll”)] 公共静态外部IntPtr fnwrapper_intar(); IntPtr ptr=fnwrapper_intar(); int[]结果=新的int[3]; 封送处理副本(ptr,结果,0,3); 您还需要在非托管Dll中编写Release函数,该函数删除FNU intarr创建的指针。此函数必须接受IntPtr作为参数

DLL_EXPORT void fnwrapper_release(int* pArray) { delete[] pArray; } [DllImport("wrapper_demo_d.dll")] public static extern void fnwrapper_release(IntPtr ptr); IntPtr ptr = fnwrapper_intarr(); ... fnwrapper_release(ptr); DLL_导出无效包装_发布(int*pArray) { 删除[]帕雷; } [DllImport(“wrapper\u demo\u d.dll”)] 公共静态外部无效FNU发布(IntPtr ptr); IntPtr ptr=fnwrapper_intar(); ... FNU发布(ptr);
如果您是FNU intarr的作者,是否有任何东西反对返回safearray(或更好的参数)?+1太好了!它成功了,除了我认为它应该是
marshall.Copy
而不是
marshall::Copy
。如果不知道C端数组的大小,该怎么办? DLL_EXPORT void fnwrapper_release(int* pArray) { delete[] pArray; } [DllImport("wrapper_demo_d.dll")] public static extern void fnwrapper_release(IntPtr ptr); IntPtr ptr = fnwrapper_intarr(); ... fnwrapper_release(ptr);