我需要将C#托管代码的结构发送到C库。 C库将填充结构中的值。我一直试图将结构作为参考传递,以便C#代码将获得更新的数据值。
这是libshlib.so中的示例C函数:
void sharedStruct(struct data* d)
{
d->number = calcSomething();
d->message = doSomething();
}
我可以发送单个参数(int和StringBuilder),库代码运行并将新值返回给调用它的C#代码。
但是如何在包含int和string的C#中创建一个结构并将其发送到非托管代码(C库),该代码将填充要在C#代码中使用的值?
C结构可能是这样的:
struct data
{
int number;
char* message;
};
现在我正在尝试建立操作C库中数据的最佳方法,以便在C#中使用。我正在编写这两段代码,所以我很灵活,但现在我无法使它工作。
答案 0 :(得分:1)
如果您希望结构由C代码填充,那么您可能正在寻找out
变量。请注意,默认情况下,单声道运行时将使用free()
取消分配您传入的任何字符串,您可能需要特别注意结构中的填充(请参阅StructLayout stuff in msdn)。对于字符串,可以使用字符集进一步解决问题。
示例代码:
Managed.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);
}
}
unmanaged.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!