除了本專題(1)和(2)提到的一些問題外,我的C++還經(jīng)常會有const char*
以及char*
這樣的參數(shù)撤蚊。C#中如何與之對應(yīng)逮诲,也值得一敘。
譬如最近寫了一個C++接口函數(shù):
extern "C" __declspec(dllexport) int __stdcall func(HANDLE handle,
const char *in_path, char *out_content, int out_content_len);
那么吟温,如果在C#中調(diào)用此函數(shù)序仙,C#中的對應(yīng)函數(shù)應(yīng)當(dāng)如何來寫呢?先給答案:
[DllImport("cplusplusDll.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int func(IntPtr Handle,
[MarshalAs(UnmanagedType.LPStr)]String inPath,
[MarshalAs(UnmanagedType.LPStr)]StringBuilder outContent,
int outContentLen);
可能大家已經(jīng)看出來了鲁豪,輸入?yún)?shù)與輸出參數(shù)在C#中對應(yīng)的類型是不同的
C++類型 | C#類型 |
---|---|
const char * (輸入?yún)?shù)) | [MarshalAs(UnmanagedType.LPStr)]String |
char * (輸出參數(shù)) | [MarshalAs(UnmanagedType.LPStr)]StringBuilder |
那么調(diào)用的時候潘悼,參數(shù)outContentLen
應(yīng)該傳入多少呢?相信看了StringBuilder的構(gòu)造函數(shù)就會知曉爬橡。
//
// 摘要:
// 使用指定的容量初始化 System.Text.StringBuilder 類的新實(shí)例治唤。
//
// 參數(shù):
// capacity:
// 此實(shí)例的建議起始大小。
//
// 異常:
// System.ArgumentOutOfRangeException:
// capacity 小于零糙申。
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public StringBuilder(int capacity);
由此可以看出宾添,outContentLen
的傳入?yún)?shù)應(yīng)當(dāng)為:
StringBuilder res = new StringBuilder(8);
// 傳入res.Capacity