2013-08-02 48 views
6

我正在開發一個應該從C#程序訪問的c .dll。理想情況下,.dll應該接收C#中定義的任何結構,並對其進行處理。所以,最初,C DLL的結構類型和大小是未知的。我能夠通過C extern函數傳遞結構,並且它被認爲是可以接收的,但是,有沒有辦法找出這個接收結構的大小和特性?有沒有辦法迭代它的成員?遍歷從c#傳遞的未知c結構#

這是爲DLL

extern int __cdecl testCSharp(mystruct * Test){ 

//sizeof(Test) is 4, so it is ok 

for(int i=0;i < sizeof(Test) ; i++){ 

    char * value = (char*) Test; //This access the first element. 
    cout << value << endl; //Prints "some random string", so, it is received ok 
} 

return 1; 

}

這是C#代碼

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)] 
unsafe public struct myStruct{ 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value1; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value2; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value3; 
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string value4; 
}; 

[DllImport("SMKcomUploadDLL.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern int testCSharp(ref myStruct message); 

static void Main() 
{ 
    int result; 

    myStruct message = new myStruct(); 

    message.value1 = "Some randome string"; 
    message.value2 = "0"; 
    message.value3 = "olkujhikvb"; 
    message.value4 = "isabedfbfmlk"; 

    result = testCSharp(ref message); 
} 

所有類型字符串在C#中定義的C函數,並且它suppossed到仍然是這樣,所以它是我所知道的關於將被傳遞的結構的唯一信息。

有什麼想法?

在此先感謝

+0

你是什麼意思*「應該接收任何在C#中定義的結構」*? C++和C#都是靜態類型語言。所以每個類型在編譯時都是已知的。此外,雙方類型的定義應該是一致的,因此編組可以毫無問題地完成。 – Nawaz

+2

我不認爲'sizeof'運算符會做你認爲它的工作。 sizeof(Test)'返回4,因爲poiner的大小是4字節(在32位機器上)。這並不意味着測試中有4項... – PoByBolek

+0

@PoByBolek - 我無法理解這段代碼在做什麼,因爲無法想象這個「簡單」的解釋。 – SChepurin

回答

2

當你與100的長度編組他們作爲ByValTStr,我不知道你能工作的任何比你已經有任何更多的(即第一個元素)。

從MSDN(here

.NET框架ByValTStr類型行爲類似於C語言風格的,固定大小的字符串 一個結構內(例如,char S [5])

如果您使用LPStr或LPWStr空終止,而您將能夠計算出它們的長度。