2009-08-03 64 views
3

我有一個C++結構PInvoke的錯誤,在一個字符串編組結構時

struct UnmanagedStruct 
{ 
    char* s; 
    // Other members 
};

和C#結構

struct ManagedStruct { 
    [MarshalAs(UnmanagedType.LPStr)] 
    string s; 
    // Other members 
}

的C++庫公開

extern "C" UnmanagedStruct __declspec(dllexport) foo(char* input); 

它是進口像

[DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)] 
    static extern ManagedStruct foo(string input); 

然而,當我把這個功能我得到

MarshalDirectiveException了未處理

方法的類型簽名不兼容的PInvoke。

問題是,如果我從結構中刪除char *和字符串s,這個函數調用就可以工作。

回答

4

對於這種類型的場景,請勿直接使用字符串。改爲將類型切換爲IntPtr值,並根據需要使用Marshal.PtrToStringAuto/Ansi/Uni。在這種情況下,由於您的本機代碼使用char*,因此PtrToStringAnsi是最佳選擇。

struct ManagedStruct { 
    IntPtr s; 
    public string sAsString { get { return Marshal.PtrToStringAnsi(s); } } 
} 
+0

爲什麼我需要這樣做?我早些時候問過這個問題,人們都說它會「正常工作」。 – DevDevDev 2009-08-03 17:57:59