gpt4 book ai didi

c# - 如何通过引用将包含字符串的结构从 C# 发送到非托管 C++ 库

转载 作者:太空宇宙 更新时间:2023-11-04 03:55:57 26 4
gpt4 key购买 nike

我需要将结构从 C# 托管代码发送到 C 库。 C 库将填充结构中的值。我一直在尝试将结构作为引用传递,以便 C# 代码将获得更新的数据值。

这是 libshlib.so 中的示例 C 函数:

void sharedStruct(struct data* d)
{
d->number = calcSomething();
d->message = doSomething();
}

我可以发送单独的参数(int 和 StringBuilder),然后库代码运行并将新值返回给调用它的 C# 代码。

但是我如何在 C# 中创建一个包含 int 和 string 的结构并将其发送到非托管代码(C 库),该代码将填充要在 C# 代码中使用的值?

C 结构可能是这样的:

struct data
{
int number;
char* message;
};

现在我正在尝试建立最佳方法来操作 C 库中的数据,以便在 C# 中使用。我正在编写这两段代码,所以我很灵活,但现在我还无法让它工作。

最佳答案

如果您希望结构由 C 代码填充,那么您可能正在寻找一个 out 变量。请注意,默认情况下,mono 运行时将使用 free() 来释放您传入的任何字符串,您可能需要格外小心结构中的填充(请参阅 StructLayout stuff in msdn)。对于字符串,字符集可能会产生更多问题。

示例代码:

托管.cs:

using System;
using System.Runtime.InteropServices;

struct Data
{
public int number;
public string message;
}

class Managed
{
[DllImport("unmanaged")]
extern static void Foo(out Data data);
static void Main()
{
Data data;
Foo(out data);
Console.WriteLine("number = {0}, message = {1}", data.number, data.message);
}
}

非托管.c:

#include <string.h>

struct data
{
int number;
char* message;
};

void Foo(struct data* data)
{
data->number = 42;
data->message = strdup("Hello from unmanaged code!");
}

测试运行:

$ mcs Managed.cs
$ gcc -shared -fPIC -o libunmanaged.so unmanaged.c
$ LD_LIBRARY_PATH=$PWD mono Managed.exe
number = 42, message = Hello from unmanaged code!

关于c# - 如何通过引用将包含字符串的结构从 C# 发送到非托管 C++ 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16469534/

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