从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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容