C++/CLI编程知识点小记

1.前言

本篇博文并非详细的C++/CLI教程,仅是博主就学习和实践总结的部分知识点记录。

第一次接触C++/CLI是2017年了,用C++编写底层库,C++/CLI编写wrapper层,在C#项目中进行调用,开发应用。

2.内容

  1. C++/CLI是一种混合编程,在.NET框架下混合使用.NET和C++语言进行编程,既可以使用native C++,又可以使用managed C++(托管C++),还可以使用.NET。
  2. 这就说明在C++/CLI中可以用native C++编写代码,可以调用C++库,可以编写托管代码和类,可以使用.NET语言,一种典型的应用是作为Wrapper封装层来封装C++库的类和接口、做C++/C#类型的转换,然后在C#应用程序中调用,开发便捷易用的应用程序。
  3. 关于native C++,托管C++,CLI,CLR等概念参考托管C++、C++/CLI、CLR-腾讯云开发者社区-腾讯云
  4. STL/CLR Library:The STL/CLR Library provides an interface similar to the C++ Standard Library containers for use with C++ and the .NET Framework common language runtime (CLR). STL/CLR is completely separate from the Microsoft implementation of the C++ Standard Library. STL/CLR is maintained for legacy support but is not kept up-to-date with the C++ standard. We strongly recommend using the native C++ Standard Library containers instead of STL/CLR whenever possible.
    在C++/CLI中可以使用和C++标准库容器非常接近的容器,享受C++标准库容器的强大能力,当然不建议这种方式使用容器,建议直接使用native C++标准库;
    STL/CLR Library Reference | Microsoft LearnLearn more about: STL/CLR Library Referenceicon-default.png?t=O83Ahttps://learn.microsoft.com/en-us/cpp/dotnet/stl-clr-library-reference?view=msvc-170
  5. 在涉及C++/C#参数转换时,可直接在C++/CLI项目中编写转换函数进行【C++到C#】或【C#到C++】的参数转换,注意基本类型(int/double/float等)不需要转换,而string、容器等需要转换;
  6. string转换:
    //返回的值需要释放内存
    wchar_t *ManagedStr2UnmanagedUniStr(String^ str)
    {IntPtr p = Marshal::StringToHGlobalUni(str);if (p == IntPtr::Zero)return(NULL);const wchar_t *pTemp = static_cast<const wchar_t *>(p.ToPointer());if (pTemp == NULL) return NULL;size_t  len = wcslen(pTemp) + 1;wchar_t *pOut = new wchar_t[len];wcscpy_s(pOut, len, pTemp);Marshal::FreeHGlobal(p);return(pOut);
    }//非托管字符串转托管的Unicode字符串
    String ^ UnmanagedStr2ManagedUniStr(wchar_t *str)
    {return Marshal::PtrToStringUni((IntPtr)str);
    }
  7. 可编写转换函数进行C++和C#间容器类型的转换,以便于在C#中调用带有标准C++ STL容器类型参数的C++接口;或将C#传递来的容器参数转换为C++ STL容器参数,以便调用底层C++库接口实现,

    void Convert(List<LineWrapper^>^ lines, list<Line>& cLines)
    {if (!lines)return;for each (LineWrapper ^ line in lines){cLines.push_back(*line->GetImplPtr());}
    }
  8. 可直接在C++/CLI中编写wrapper类以便于在C#项目中使用以存在的功能强大的C++类,

    public ref class LineWrapper{public:LineWrapper(){mImpl = new Line();}LineWrapper(const Line* impl){mImpl = new Line(*impl);}~LineWrapper(){delete mImpl;}property Vector3Wrapperf^ Pt0{Vector3Wrapperf^ get(){Vector3f pt = mImpl->pt0;return gcnew Vector3Wrapperf(pt.X, pt.Y, pt.Z);};void set(Vector3Wrapperf^ pt){mImpl->pt0.X = pt->X;mImpl->pt0.Y = pt->Y;mImpl->pt0.Z = pt->Z;};}property Vector3Wrapperf^ Pt1{Vector3Wrapperf^ get(){Vector3f pt = mImpl->pt1;return gcnew Vector3Wrapperf(pt.X, pt.Y, pt.Z);};void set(Vector3Wrapperf^ pt){mImpl->pt1.X = pt->X;mImpl->pt1.Y = pt->Y;mImpl->pt1.Z = pt->Z;};}Line* GetImplPtr(){return mImpl;}private:Line* mImpl;};
  9. 对于native C++库中的模板类,在C++/CLI项目中需要继承方式实例化模板类,从而在C#项目中使用实例化的类,

           template<typename T>public ref class Vector3Wrapper{public:static Vector3Wrapper^ BasicX = gcnew Vector3Wrapper;static Vector3Wrapper^ BasicY = gcnew Vector3Wrapper;static Vector3Wrapper^ BasicZ = gcnew Vector3Wrapper;static Vector3Wrapper^ Zero = gcnew Vector3Wrapper;public:property T X{void set(T x) { mImpl->X = x; }T get() { return mImpl->X; }}property T Y{void set(T y) { mImpl->Y = y; }T get() { return mImpl->Y; }}property T Z{void set(T z) { mImpl->Z = z; }T get() { return mImpl->Z; }}Vector3Wrapper() { mImpl = new Vector3<T>(); }Vector3Wrapper(const Vector3<T>* impl) { mImpl = new Vector3<T>(*impl); }Vector3Wrapper(T x, T y, T z) { mImpl = new Vector3<T>(x,y,z); }template<typename ST> Vector3Wrapper(Vector3Wrapper<ST>% other) { mImpl = new Vector3<T>(*other.mImpl); };virtual ~Vector3Wrapper() { delete mImpl; };public:void Normalize() { mImpl->Normalize(); };//  define other functions hereVector3<T>* GetImplPtr() { return mImpl; };private:Vector3<T>* mImpl;};public ref class Vector3Wrapperf : public Vector3Wrapper<float>{public:Vector3Wrapperf(float x, float y, float z) : Vector3Wrapper(x, y, z) {}Vector3Wrapperf(): Vector3Wrapper(){ }Vector3Wrapperf(const Vector3<float>* impl): Vector3Wrapper(impl){ }~Vector3Wrapperf() { };//define other functions here};
  10. 在C++/CLI项目中同样需要提取公共函数或类,便于使用,

3.参考文章

1、从C++到C++/CLI

https://www.cnblogs.com/feisky/archive/2009/11/22/1607999.htmlicon-default.png?t=O83Ahttps://www.cnblogs.com/feisky/archive/2009/11/22/1607999.html2、相关博文:

C++/CLI 总结_array^ arr = gcnew-CSDN博客文章浏览阅读1.2k次,点赞5次,收藏14次。在Windows上,除非我们必须得用C++来写界面,否则我会选择避免,避免学习和使用MFC。替代的方案是用C#来做界面,然后用C++/CLI来连接C#和Native C++。那么问题来了,C++/CLI是何方神圣?  百度上对于C++/CLI是这么说的——“C++/CLI是静态C++对象模型到CLI的动态组件对象编程模型的捆绑。简而言之就是如何用C++在·NET中编程,而不是C#或Visual B..._array^ arr = gcnewhttps://blog.csdn.net/weixin_29130507/article/details/802673293、微软官方说明文档:

Generic Classes (C++/CLI) | Microsoft LearnLearn more about: Generic Classes (C++/CLI)icon-default.png?t=O83Ahttps://learn.microsoft.com/en-us/cpp/extensions/generic-classes-cpp-cli?view=msvc-170.NET programming with C++/CLI | Microsoft LearnLearn how to use C++/CLI to create .NET apps and components in Visual Studio.icon-default.png?t=O83Ahttps://learn.microsoft.com/en-us/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=msvc-170Generic Functions (C++/CLI) | Microsoft LearnLearn more about: Generic functions (C++/CLI)icon-default.png?t=O83Ahttps://learn.microsoft.com/en-us/cpp/extensions/generic-functions-cpp-cli?view=msvc-170

4、【原】C++与C#对常用数据结构封装的对比(STL vs System.Collections.Generic)https://www.cnblogs.com/cocoaleaves/archive/2009/05/30/1492269.html

5、Convert all values from dictionary into list in C++/CLIc++ cli - Convert all values from dictionary into list in C++/CLI - Stack Overflow 

6、c++ - Cpp/Cli Convert std::map to .net dictionary - Stack Overflow

7、C++/CLI封装原生C++库供.NET项目调用-CSDN博客 

8、Use C++ CLI template class in C#
.net - Use C++ CLI template class in C# - Stack Overflow

9、C++/CLI: functions inherited from template class are not visible in C#

.net - C++/CLI: functions inherited from template class are not visible in C# - Stack Overflow 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/880030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哈希简单介绍

1.直接定址法&#xff08;值的分布范围集中&#xff09; 比如统计字符串中字符出现的字数&#xff0c;字符范围是集中 2.除留余数法&#xff08;值的分布范围分散&#xff09; hashkey%n 哈希冲突&#xff1a;不同的值映射到相同的位置 解决哈希冲突的方案&#xff1a; 闭散…

Kafka集群扩容(新增一台kafka节点)

kafka集群扩容、kafka topic迁移 现有环境 IP组件角色192.168.17.51kafka01broker1192.168.17.52kafka02broker2192.168.17.53kafka03broker3 扩容之后环境 IP组件角色192.168.17.51kafka01broker1192.168.17.52kafka02broker2192.168.17.53kafka03broker3192.168.17.54ka…

三端全隔离压接端子485中继器磁耦隔离数据双向透传工业级2口信号放大器抗干扰防雷

美思联压接端子485中继器磁耦隔离工业级2口信号放大器抗干扰防雷https://item.taobao.com/item.htm?ftt&id736247434823 MS-H312S是一款专为工业自动化通信而生解决RS-485总线星型结构组网&#xff0c;解决复杂电磁场环境下RS-485大系统要求而设计的RS-485总线分割集线器(…

【设计模式】万字详解:深入掌握五大基础行为模式

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 【设计模式】&#xf…

Linux中使用cp命令的 -f 选项,但还是提醒覆盖的问题

问题&#xff1a; linux 在执行cp的命令的时候&#xff0c;就算是执行 cp -f 也还是会提醒是否要进行替换。 问题原因&#xff1a; 查看别名&#xff0c;alias命令&#xff0c;看到cp的别名为cp -i&#xff0c;那就是说cp本身就是自带覆盖提醒&#xff0c;就算我们加上-f 的…

JavaEE初阶——初识EE(Java诞生背景,CPU详解)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能帮到你&#xff01; 目录 零&#xff1a;Java的发展背景介绍 一&#xff1a;EE的概念 二&#xff1a;计算机的构成 1&#xff1a;CU…

五、CAN总线

目录 一、基础知识 1、can介绍 2、CAN硬件电路 3、CAN电平标准 4、CAN收发器芯片介绍 5、CAN帧格式 ① CAN帧种类 ② CAN数据帧 ③ CAN遥控帧​编辑 ④ 位填充 ⑤ 波形实例 6、接收方数据采样 ① 接收方数据采样遇到的问题 ② 位时序 ③ 硬同步 ④ 再同步 ⑤ 波…

Java的IO流(二)

目录 Java的IO流&#xff08;二&#xff09; 字节缓冲流 基本使用 使用缓冲流复制文件 字符缓冲流 缓冲流读取数据原理 字符编码 字符集 转换流 序列化流与反序列化流 基本使用 禁止成员被序列化 序列号不匹配异常 打印流 基本使用 系统打印流与改变流向 Prop…

【网络安全】依赖混淆漏洞实现RCE

未经许可&#xff0c;不得转载。 文章目录 正文 依赖混淆是一种供应链攻击漏洞&#xff0c;发生在企业的内部依赖包错误地从公共库&#xff08;如npm&#xff09;下载&#xff0c;而不是从其私有注册表下载。攻击者可以在公共注册表中上传一个与公司内部包同名的恶意包&#xf…

【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器

【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级&#xff0c;手写实现一个微服务熔断限流器 服务雪崩熔断、限流、降级熔断降级限流 手写实现一个微服务熔断限流器架构设计代码实现整体逻辑ProtectorAspect#aroundMethod(ProceedingJoinPoint)具体实现1、获取接口对…

低级编程语言和高级编程语言

一.区分低级编程语言和高级编程语言的方法 1.低级编程语言 低级编程语言,并不是简单的编程语言,而是写起来很费事的编程语言,如所有编程语言的"祖宗":汇编语言,写起来极其麻烦,说不定一个 int a1; 它就得写好几行,甚至十几行 这样麻烦的编程语言为什么还没消失那,因…

P9235 [蓝桥杯 2023 省 A] 网络稳定性

*原题链接* 最小瓶颈生成树题&#xff0c;和货车运输完全一样。 先简化题意&#xff0c; 次询问&#xff0c;每次给出 &#xff0c;问 到 的所有路径集合中&#xff0c;最小边权的最大值。 对于这种题可以用kruskal生成树来做&#xff0c;也可以用倍增来写&#xff0c;但不…

react:组件通信

组件通信 父组件向子组件通信 function App() {return (<div><div>这是父组件</div><Child name"这是子组件" /></div>); }// 子组件 function Child(props) {return <div>{props.name}</div>; }props说明 props可以传…

[Python学习日记-26] Python 中的文件操作

[Python学习日记-26] Python 中的文件操作 简介 操作模式 循环文件 其他功能 混合模式 修改文件 简介 在 Python 中的文件操作其实和我们平时使用的 Word 的操作是比较类似的&#xff0c;我们先说一下 Word 的操作流程&#xff0c;流程如下&#xff1a; 找到文件&#x…

re题(39)BUUCTF-[FlareOn3]Challenge1

BUUCTF在线评测 (buuoj.cn) 查壳是32位&#xff0c;ida打开&#xff0c;进入main函数&#xff0c;进入sub_401260看看 查看byte_413000存的字符串 _BYTE *__cdecl sub_401260(int a1, unsigned int a2) {int v3; // [espCh] [ebp-24h]int v4; // [esp10h] [ebp-20h]int v5; //…

python selenium网页操作

一、安装依赖 pip install -U seleniumselenium1.py&#xff1a; from selenium import webdriver from selenium.webdriver.common.by import Bydriver webdriver.Chrome() driver.get("https://www.selenium.dev/selenium/web/web-form.html") title driver.ti…

https的连接过程

根证书: 内置在操作系统和浏览器中,可手动添加,下级是中间证书或服务器证书,只有当中间证书或服务器证书关联到已存在的根证书时,中间证书或服务器证书才视为有效 中间证书: 位于根证书和服务器证书之间,他们之间也可以没有中间证书,作用是对根证书增加一个下级,方便管理,由根…

整合多方大佬博客以及视频 一文读懂 servlet

参考文章以及视频 文章&#xff1a; 都2023年了&#xff0c;Servlet还有必要学习吗&#xff1f;一文带你快速了解Servlet_servlet用得多吗-CSDN博客 【计算机网络】HTTP 协议详解_3.简述浏览器请求一个网址的过程中用到的网络协议,以及协议的用途(写关键点即可)-CSDN博客 【…

yolov8旋转目标检测之绝缘子检测-从数据加载到模型训练、部署

YOLOv8 是 YOLO (You Only Look Once) 系列目标检测算法的最新版本&#xff0c;以其高速度和高精度而著称。在电力行业中&#xff0c;绝缘子是电力传输线路上的重要组件之一&#xff0c;它们用于支撑导线并保持电气绝缘。由于长期暴露在户外环境中&#xff0c;绝缘子容易出现损…

【JavaEE】多线程编程引入——认识Thread类

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能帮到你&#xff01; 目录 引入&#xff1a; 一&#xff1a;Thread类 1&#xff1a;Thread类可以直接调用 2&#xff1a;run方法 &a…