如何将C数据导出到C#结构?
发布时间:2020-12-16 07:35:12 所属栏目:百科 来源:网络整理
导读:我正在努力将C结构数据导出到C#. 假设我有以下结构代表一个3浮点向量: // C++struct fvec3{public: float x,y,z; fvec3(float x,float y,float z) : x(x),y(y),z(z) { }};// C#[StructLayout(LayoutKind.Sequential)]struct fvec3{ public float x,z; publi
我正在努力将C结构数据导出到C#.
假设我有以下结构代表一个3浮点向量: // C++ struct fvec3 { public: float x,y,z; fvec3(float x,float y,float z) : x(x),y(y),z(z) { } }; // C# [StructLayout(LayoutKind.Sequential)] struct fvec3 { public float x,z; public fvec3(float x,float z) { this.x = x; this.y = y; this.z = z; } } 现在,如果我想使用从C#到C的fvec3,我可以使用以下内容而不会出现问题: // C++ __declspec(dllexport) void Import(fvec3 vector) { std::cout << vector.x << " " << vector.y << " " << vector.z; } // C# [DllImport("example.dll",CallingConvention = CallingConvention.Cdecl)] public static extern void Import(fvec3 vector); ... Import(new fvec3(1,2,3)); // Prints "1 2 3". 现在的问题是反过来:将C fvec3返回给C#.我怎样才能做到这一点? // C# [DllImport("example.dll",CallingConvention = CallingConvention.Cdecl)] public static extern void Export(out fvec3 vector); ... fvec3 vector; Export(out vector); // vector contains the value given by C++ 但是我该如何编写C Export功能呢? 我尝试了所有我能想到的签名和身体: // Signatures: __declspec(dllexport) void Export(fvec3 vector) __declspec(dllexport) void Export(fvec3* vector) __declspec(dllexport) void Export(fvec3& vector) // Bodies (with the pointer variants) vector = fvec3(1,3); memcpy(&fvec3(1,3),&vector,sizeof(fvec3)); *vector = new fvec(1,3); 其中一些没有效果,一些返回垃圾值,一些导致崩溃. 解决方法
ref和out参数通常与指针参数匹配.
试试这个: __declspec(dllexport) void Export(fvec3 *vector) { *vector = fvec3(1,3); } (未测试) 或者,您应该只需从函数中返回一个fvec3: // C++ __declspec(dllexport) fvec3 Export(void) { return fvec3(1,3); } // C# [DllImport("example.dll",CallingConvention = CallingConvention.Cdecl)] public static extern fvec3 Export(); ... fvec3 vector = Export(); (未测试) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |