如何通过ref将包含字符串的struct从C#发送到非托管C++;图书馆

如何通过ref将包含字符串的struct从C#发送到非托管C++;图书馆,c#,c,mono,unmanaged,managed,C#,C,Mono,Unmanaged,Managed,我需要从C托管代码向C库发送一个结构。C库将填充结构中的值。我一直在尝试将结构作为引用传递,以便C#代码将获得更新的数据值 这是libshlib.so中的一个示例C函数: void sharedStruct(struct data* d) { d->number = calcSomething(); d->message = doSomething(); } 我可以发送单独的参数(int和StringBuilder),库代码运行并向调用它的C#代码返回新值 但是,如何在

我需要从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()
取消分配传入的任何字符串,您可能需要特别注意结构中的填充(请参阅)。对于字符串,字符集可能会有进一步的问题

示例代码:

Managed.cs:

使用系统;
使用System.Runtime.InteropServices;
结构数据
{
公共整数;
公共字符串消息;
}
班级管理
{
[DllImport(“非托管”)]
外部静态void Foo(输出数据);
静态void Main()
{
数据;
Foo(输出数据);
WriteLine(“number={0},message={1}”,data.number,data.message);
}
}
非托管。c:

#包括
结构数据
{
整数;
字符*消息;
};
void Foo(结构数据*数据)
{
数据->编号=42;
data->message=strdup(“来自非托管代码的你好!”);
}
试运行:

$mcs Managed.cs
$gcc-shared-fPIC-o libunmanaged.so unmanaged.c
$LD_LIBRARY_PATH=$PWD mono Managed.exe
number=42,message=Hello来自非托管代码!

如果希望结构由C代码填充,则可能需要查找
out
变量。请注意,mono运行时在默认情况下将使用
free()
取消分配传入的任何字符串,您可能需要特别注意结构中的填充(请参阅)。对于字符串,字符集可能会有进一步的问题

示例代码:

Managed.cs:

使用系统;
使用System.Runtime.InteropServices;
结构数据
{
公共整数;
公共字符串消息;
}
班级管理
{
[DllImport(“非托管”)]
外部静态void Foo(输出数据);
静态void Main()
{
数据;
Foo(输出数据);
WriteLine(“number={0},message={1}”,data.number,data.message);
}
}
非托管。c:

#包括
结构数据
{
整数;
字符*消息;
};
void Foo(结构数据*数据)
{
数据->编号=42;
data->message=strdup(“来自非托管代码的你好!”);
}
试运行:

$mcs Managed.cs
$gcc-shared-fPIC-o libunmanaged.so unmanaged.c
$LD_LIBRARY_PATH=$PWD mono Managed.exe
number=42,message=Hello来自非托管代码!

你能给我们看一下
C
struct吗?你能给我们看
C
struct吗?哇,有那么简单吗??!!感谢您发布所有详细信息。经过多次尝试,我最终为number和message指定了MarshallAs,并将结构作为ref传递,发现我必须初始化message才能使其工作。我也使用了:[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]哇,有那么简单吗??!!感谢您发布所有详细信息。经过多次尝试,我最终为number和message指定了MarshallAs,并将结构作为ref传递,发现我必须初始化message才能使其工作。我还使用了:[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]