gpt4 book ai didi

c# - 从 c char* 到 string/IntPtr c# 的转换

转载 作者:行者123 更新时间:2023-11-30 18:31:29 37 4
gpt4 key购买 nike

我为 C 控制台应用程序创建了一个包装器,在其中定义了一个结构以将输出传递到 C# Windows 窗体。该结构包含一个 char* 变量,必须在 C# 代码中正确解释该变量。我使用了IntPtr类型,但没有得到想要的结果,只得到了一个我认为可能是内存地址的数字。

C部分:

struct struct_name{
int a;
char* s;
}

extern __declspec(dllexport) struct_name compute_calc(int opt, char* file_1, char* file_2)

C# 部分:

[DllImport("dll_name.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern struct_name compute_calc(int opt, String file1, String file2)

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Auto)]
public struct struct_name{
Int32 a;
IntPtr s;
}

在应用程序中,我使用以下代码调用该函数

struct_name result = levenshtein(1, filePath1, filePath2);

此时我的问题是使用 char*/IntPtr 提取结构中包含的字符串。我尝试使用 How can I convert an unmanaged IntPtr type to a c# string? 中建议的编码操作但我的结果只是一个数字。有没有其他方法可以将 IntPtr 转换为 c 代码中使用的正确字符串?

编辑:结构中的整数已正确传递。问题仅出在 char*

编辑2:

struct_name result;

{..some code...}--> output int N, char* s0


result.s = (char*)malloc( sizeof(char)*n);

result.a=N;
result.s=_strdup(s0)

return result;

这是建议中要求的 C 部分代码。

最佳答案

Marshal.PtrToStringAnsi() 是将 IntPtr 转换为字符串所需的。 IntPtr 持有一个 char*,而 Marshal.PtrToStringAnsi() 就是你的人。

但是,您已经尝试过但没有成功。所以我怀疑你的问题更根本。也许互操作边界两侧处理大型结构的方式存在二进制不匹配。这是互操作的一部分,不同的工具表现不同。应始终使用 out 参数返回结构。将 native 代码更改为如下所示:

__declspec(dllexport) int compute_calc(int opt, const char* file_1, 
const char* file_2, struct_name* result)

托管方是:

[StructLayout(LayoutKind.Sequential)]    
public struct struct_name{
int a;
IntPtr s;
}

[DllImport("dll_name.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int compute_calc(int opt, string file1, string file2,
out struct_name result);

请注意,我还从您的结构声明中删除了 Pack = 1。除非 C 代码使用#pragma pack,并且不应该这样做,否则这会导致 64 位代码下的不匹配。

关于c# - 从 c char* 到 string/IntPtr c# 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22483380/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com