2008-10-02 71 views
18

下面的C函數的DLL:元帥 「的char *」,在C#

char * GetDir(char* path); 

你會怎樣的P/Invoke此功能爲C#和元帥的char *正常。 .NET似乎知道如何做LPCTSTR,但是當我找不到任何不會導致調用此函數時觸發NotSupportedException的任何編組。

回答

21

如果從GetDir返回的char *被分配在HGlobal或LocalAlloc中,OregonGhost的答案是正確的。我不記得哪一個,但CLR會認爲來自PInvoke函數的任何字符串返回類型都被分配了一個或另一個。

更健壯的方法是輸入GetDir的返回值爲IntPtr。然後,您可以使用任何Marshal.PtrToStringAnsi函數來獲取字符串類型。它還爲您提供了以您選擇的方式釋放字符串的靈活性。


[DllImport("your.dll", CharSet = CharSet.Ansi)] 
IntPtr GetDir(StringBuilder path); 

您能否給我們任何其他關於GetDir行爲的提示?它是否修改輸入字符串?如何分配返回的值?如果你能提供,我可以給出更好的答案。

+0

Ahhhh .... PtrToStringAnsi是我正在尋找的,我曾想出在此期間使用IntPtr,但現在我遇到了一個障礙...我使用.NETCF和PtrToStringAnsi只在完整的框架:( – 2008-10-02 17:42:54

12

嘗試

[DllImport("your.dll", CharSet = CharSet.Ansi)] 
string GetDir(StringBuilder path); 

串會被自動編組到0結尾的字符串,並與CharSet屬性,你告訴的Marshaller,它應該使用ANSI而不是Unicode格式。 注意:使用字符串(或System.String)作爲const char *,但使用StringBuilder作爲char *。

您也可以嘗試MarshalAs,如this example

+2

你知道爲什麼`string ansi = Marshal.PtrToStringAnsi(ptr);`會成功,但用`CharSet = CharSet.Ansi`返回一個`string`會失敗嗎? – jocull 2015-06-09 00:23:18