除了本专题(1)和(2)提到的一些问题外,我的C++还经常会有const char*
以及char*
这样的参数。C#中如何与之对应,也值得一叙。
譬如最近写了一个C++接口函数:
extern "C" __declspec(dllexport) int __stdcall func(HANDLE handle,
const char *in_path, char *out_content, int out_content_len);
那么,如果在C#中调用此函数,C#中的对应函数应当如何来写呢?先给答案:
[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);
可能大家已经看出来了,输入参数与输出参数在C#中对应的类型是不同的
C++类型 | C#类型 |
---|---|
const char * (输入参数) | [MarshalAs(UnmanagedType.LPStr)]String |
char * (输出参数) | [MarshalAs(UnmanagedType.LPStr)]StringBuilder |
那么调用的时候,参数outContentLen
应该传入多少呢?相信看了StringBuilder的构造函数就会知晓。
//
// 摘要:
// 使用指定的容量初始化 System.Text.StringBuilder 类的新实例。
//
// 参数:
// capacity:
// 此实例的建议起始大小。
//
// 异常:
// System.ArgumentOutOfRangeException:
// capacity 小于零。
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public StringBuilder(int capacity);
由此可以看出,outContentLen
的传入参数应当为:
StringBuilder res = new StringBuilder(8);
// 传入res.Capacity
网友评论