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

news2024/12/23 16:18:28

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 here
               
    
               Vector3<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.coloradmin.cn/o/2143948.html

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

相关文章

不要沉迷大模型的技术与理论,学习大模型的方法——从做一个小应用开始

“ 在应用中学习技术&#xff0c;而不是沉迷于技术本身 ” 不知道大家都是怎么学习大模型技术的&#xff0c;但从个人的经验和公众号的反馈来看&#xff0c;有些人在学习大模型技术时转进了牛角尖&#xff0c;导致很多东西学不明白&#xff0c;事倍功半。 今天就从个人的学习…

基于SpringBoot+Vue的校园礼服装租赁系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

Aigtek电压放大器用途有哪些方面

电压放大器是一种电子电路设备&#xff0c;主要用于将输入信号的电压放大到更大的幅度&#xff0c;增强信号的强度和质量。电压放大器具有广泛的应用领域&#xff0c;下面安泰电子将从以下几个方面详细介绍电压放大器的用途。 信号处理&#xff1a;电压放大器可以用于对各种信号…

Transformer 的可视化解释

Transformer 的可视化解释&#xff1a;了解 LLM Transformer 模型如何与交互式可视化配合使用 部署 Nodejs version > 20.0 git clone https://github.com/poloclub/transformer-explainer.git cd transformer-explainer npm install npm run dev# fix: cnpm install --pl…

物联网行业中小型嵌入式文件系统详解以及使用

一 概述 在嵌入式系统使用过程中&#xff0c;为了方便数据的存储&#xff0c;我们加入了串行的外部Flash(SPI通信)。在使用存储的时候&#xff0c;如需要记录一个字符串“奇迹物联Bloom OS”&#xff0c;我们可以把这些文字转化成 ASCII 码&#xff0c;存储在数组中&#xff0c…

激光模组多少钱一套?具体费用的决定因素

激光模组作为现代科技领域的重要组件&#xff0c;然而&#xff0c;对于许多潜在买家而言&#xff0c;激光模组的价格往往是一个令人困惑的问题。本文将跟大家一起探讨激光模组的价格范围及其具体费用的决定因素。 激光模组的价格范围 激光模组的价格因多种因素而异&#xff0c;…

基于Qt的串口调试工具串口常见问题

1.项目地址 https://github.com/zhangjiechina001/SerialPortTool 2.使用注意 串口的所有参数波特率、数据位、校验位、停止位、控制流都需要设置正确&#xff0c;设置错了有时会连接上但是传输的数据会很奇怪&#xff0c;有时直接连接不上了 3.串口通讯参数解释 串口通讯&a…

C++掉血迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <string> #include <cstring> using namespace std; enum RBYG {R 1,B 2,Y 4,G 7, }; struct heal {int ix…

7 款 Mac 剪贴板管理器帮助你改善工作流

大家都知道&#xff0c;Mac自带的剪贴板功能实在是太简陋了。复制一下、粘贴一下&#xff0c;就这么点能耐&#xff0c;简直就是个临时小仓库。 如果你经常需要复制粘贴各种内容&#xff0c;Mac原生的剪贴板可能反而会拖你的后腿。这时候&#xff0c;是时候升级一下你的剪贴板…

自有平台自有品牌如何利用电商API接口做定价参考(多平台商品详情数据接口)

如今&#xff0c;多数自有商城自有品牌在为产品做定价时都会参考淘宝|天猫|京东等主流电商平台的商品价格以做参考&#xff0c;这一行为的好处主要有以下几点&#xff1a; 通过参考主流平台价格&#xff0c;用户更能了解目标市场中消费者对产品的接受度&#xff0c;从而制定出符…

C++速通LeetCode简单第17题-爬楼梯(全网最简单)

思路要点&#xff1a;将问题转化为求斐波那契数列的第n项&#xff0c;然后迭代。 思路分析&#xff1a;最后一次爬的阶数不是1就是2&#xff0c;假设爬n阶的方法数是f(n)&#xff0c;假设最后一次爬1阶&#xff0c;那么爬前面的 n-1阶的方法数是f(n-1)&#xff1b;假设最后一次…

DepthCrafter:为开放世界视频生成一致的长深度序列

通过利用视频扩散模型&#xff0c;我们创新了一种新颖的视频深度估算方法–DepthCrafter。 它可以为开放世界视频生成具有细粒度细节的时间一致性长深度序列&#xff0c;而无需摄像机姿势或光流等附加信息。 简介 动机。 尽管在静态图像的单目深度估算方面取得了重大进展&…

Vue2集成高德地图遇到的几个问题

文章目录 前言集成地图实现的功能遇到的问题Uncaught Error: Invalid Object: LngLat(NaN, NaN)搜索结果不显示地图异步加载问题 写在最后 前言 几年没碰过前端了&#xff0c;最近闲来无事在捣鼓一个小项目&#xff0c;项目中一个功能涉及到地图组件&#xff0c;没想到在集成高…

敏捷项目管理:团队高效协作的关键

在当今快节奏的市场环境中&#xff0c;企业必须具备快速响应变化的能力。无论是产品研发、软件开发还是市场推广&#xff0c;灵活应对变化和高效管理项目已成为企业成功的关键。于是&#xff0c;敏捷开发这一理念越来越多地被各行业团队采纳&#xff0c;成为了他们高效协作、及…

git学习【持续更新中。。。】

git学习【持续更新中。。。】 文章目录 git学习【持续更新中。。。】一、Git基本操作1.创建本地仓库2.配置本地仓库1.局部配置2.全局配置 3.认识工作区、暂存区、版本库4.添加文件5.修改文件6.版本回退7.撤销修改8.删除文件9.理解分支10.创建、切换、合并分支11.删除分支12.合并…

B站开源长文本大模型:我很小但很能“装”

一、“2% GPT size, yet powerful.” 模型简介 Index-1.9B-32K 是一个拥有 1.9B &#xff08;19亿&#xff09;参数并具备 32K 上下文长度的语言模型&#xff08;这意味着&#xff0c;这个超小精灵可以一次性读完 3.5 万字以上的文档&#xff09;。 在多项长文本评测任务中&am…

单链表的实现(C语言)

目录 1.单链表 1.1 实现单链表 1.1.1 文件创建 1.1.2 链表功能了解 1.1.3 链表的结点 1.1.4 链表的函数声明 1.1.5 链表功能的实现 链表是一种链式结构&#xff0c;物理结构不连续&#xff0c;逻辑结构是连续的&#xff0c;在计算机中链表的实际存储是按照一个结点内存放…

基于springboot+vue实现的智能垃圾分类系统 (源码+L文+ppt)4-063

摘 要 本论文主要完成不同用户的权限划分&#xff0c;不同用户具有不同权限的操作功能&#xff0c;系统包括用户、物业和管理员模块&#xff0c;主要功能有用户、物业、垃圾站点、垃圾投放、验收信息、积分商城、积分充值、通知物业等管理操作。 关键词&#xff1a;智能垃圾…

微信支付开发-前端api实现

一、操作流程图 二、代码实现 <?php /*** 数字人答题业务流* User: 龙哥三年风水* Date: 2024/9/11* Time: 14:59*/ namespace app\controller\shuziren; use app\controller\Base; use app\model\param\QuestionParam as PQPModel; use app\model\answer\QuestionBank; u…

codemirror 代码在线编辑器基本使用

CodeMirror 是一个强大的基于浏览器的文本编辑器组件&#xff0c;主要用于网页中创建可编辑的源代码区域&#xff0c;特别适用于编写和展示程序代码。它支持多种编程语言的语法高亮、代码折叠、自动补全、查找替换等多种高级编辑特性。 npm install vue-codemirror --save 或者…