如何通过包含从C#到非托管C ++库的字符串的ref发送结构

时间:2013-05-09 19:23:31

标签: 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#代码。

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

C结构可能是这样的:

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

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

1 个答案:

答案 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!