为了账号安全,请及时绑定邮箱和手机立即绑定

C# 将带有字符串的结构编组到 C 库

C# 将带有字符串的结构编组到 C 库

C#
烙印99 2021-11-14 10:52:36
我正在编写一个必须与 Unity3D (C#) 交互的 C 库,并且在编写我的 PInvoke 调用之一时遇到了问题。我有以下 c 结构typedef struct TestStruct{    const char* Method;    const char* Url;} TestStruct;和 C 函数签名__declspec(dllexport) void __cdecl TestMethod(TestStruct* args){    // Do stuff with Method and URL}在 C# 中,我像这样创建了结构[StructLayout(LayoutKind.Sequential)]public struct TestStruct{    public string Method;    public string Url;}和 PInvoke 签名一样[DllImport("Test", CallingConvention = CallingConvention.Cdecl)]private static extern void TestMethod(TestStruct args);现在,当我在 Win64 上的 Unity 编辑器中运行它时,它工作得很好。但是,当我将它部署到我的 android 设备(我认为是 32 位 ARM 架构的 Nexus 6)时,当它们到达 C 库时,我的测试结构中的 Method 和 Url 属性为空。奇怪的是,如果我更改我的函数签名以采用完全避免结构的原始参数,它就可以正常工作。__declspec(dllexport) void __cdecl TestMethod(const char* Method, const char* Url){    // Do stuff with Method and URL}和[DllImport("Test", CallingConvention = CallingConvention.Cdecl)]private static extern void TestMethod(string method, string url);工作得很好。有谁知道我可能做错了什么?
查看完整描述

1 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

这个:


__declspec(dllexport) void __cdecl TestMethod(TestStruct* args)

相当于:


[DllImport("Test", CallingConvention = CallingConvention.Cdecl)]

private static extern void TestMethod(ref TestStruct args);

或者out TestStruct,取决于谁将写入TestStruct.


重要提示:如果strings 是通过 C->C# 传递的,那么 C# 不应修改它们(否则 .NET 将尝试使用错误的解除分配器释放它们,并且会发生不好的事情)。如果您使用out TestStructC 端将不得不取消分配返回的const char*我不得不说我不知道具体如何(因为您在 Windows 下使用的是 Unity 而不是 .NET,所以事情变得有点麻烦)


查看完整回答
反对 回复 2021-11-14
  • 1 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信