1

我需要将结构从 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# 中使用的最佳方法。我正在编写两段代码,所以我很灵活,但现在我无法让它工作。

4

1 回答 1

1

如果您希望结构由 C 代码填充,那么您可能正在寻找一个out变量。请注意,默认情况下,mono 运行时将用于free()释放您传入的任何字符串,并且您可能需要特别注意结构中的填充(请参阅msdn 中的 StructLayout 内容)。对于字符串,字符集可能会出现更多问题。

示例代码:

托管.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!
于 2013-05-10T02:09:30.387 回答