从Emgu学习C#调用C++库(3)

除了本专题(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

你可能感兴趣的:(从Emgu学习C#调用C++库(3))