2013-05-09 46 views
1

我需要從C#託管代碼發送一個結構到C庫。 C庫將填充結構中的值。我一直試圖傳遞結構作爲參考,以便C#代碼將獲得更新的數據值。如何發送一個結構由ref包含從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#中使用操縱數據的最佳方式。我正在編寫這兩個代碼片段,所以我很靈活,但現在我無法使其工作。

+0

,你能否告訴我們'C'結構? – 2013-05-09 19:26:04

回答

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! 
+1

哇,能不能那麼簡單?感謝您發佈所有的細節。經過多次嘗試後,我最終爲數字和消息指定了MarshallAs,並將該結構作爲參數傳遞,並發現我必須初始化消息以使其工作。我也使用:\t [StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi)]] – Barry 2013-05-10 03:34:18

相關問題