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.rhkb.cn/news/431865.html

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

相关文章

使用Maven创建一个Java项目并在repository中使用

JDK环境&#xff1a;1.8.0_371 Maven环境 &#xff1a;Apache Maven 3.6.3 配置完成jdk和mvn后&#xff0c;进入到指定文件夹下执行如下语句&#xff1a; mvn archetype:generate -DgroupIdtop.chengrongyu -DartifactIdCyberSpace -DarchetypeArtifactIdmaven-archetype-quic…

Android开发okhttp下载图片带进度

Android开发okhttp下载图片带进度 下载网络图片的方法有很多&#xff0c;这次介绍写用okhttp来下载网络图片&#xff0c;主要我看中的是用okhttp下载有进度返回&#xff0c;提示下用户 一、思路&#xff1a; 用OkHttpClient().newCall(request) 二、效果图&#xff1a; 三、…

AI大模型助力数据消费,构建数据飞轮科学、高效的体系

随着互联网的技术高速发展&#xff0c;越来越多的应用层出不穷&#xff0c;伴随着数据应用的需求变多&#xff0c;为快速响应业务需求&#xff0c;很多企业在初期没有很好的规划的情况下&#xff0c;存在不同程度的烟囱式的开发模式&#xff0c;这样会导致企业不同业务线的数据…

分布式Id生成策略-美团Leaf

之前在做物流相关的项目时候&#xff0c;需要在分布式系统生成运单的id。 1.需求&#xff1a; 1.全局唯一性&#xff1a;不能出现重复的ID。&#xff08;基本要求&#xff09; 2.递增&#xff1a;大多数关系型数据库&#xff08;如 MySQL&#xff09;使用 B 树作为索引结构。…

大数据 flink 01 | 从零环境搭建 简单Demo 运行

什么是Flink Flink是一个开源的流处理和批处理框架,它能够处理无界和有界的数据流&#xff0c;具有高吞吐量、低延迟和容错性等特点 Flink 可以应用于多个领域如&#xff1a;实时数据处理、数据分析、机器学习、事件驱动等。 什么是流式处理&#xff1f;什么是批处理 流处理…

吴师兄:非科班程序员,创作出Github标星75.3K的宝藏项目,一周爆火……

这是《开发者说》的第18期&#xff0c;今天我们采访的是在Github上传LeetCode动画题解&#xff0c;获得75.3K标星宝藏项目的程序员吴师兄。 吴师兄从985大学毕业&#xff0c;从通信工程外包零基础转码程序员&#xff0c;逐渐进入一些中厂和大厂&#xff0c;工资也从三四千起步…

Elasticsearch——介绍、安装与初步使用

目录 1.初识 Elasticsearch1.1.了解 ES1.1.1.Elasticsearch 的作用1.1.2.ELK技术栈1.1.3.Elasticsearch 和 Lucene1.1.4.为什么不是其他搜索技术&#xff1f;1.1.5.总结 1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引1.2.3.正向和倒排 1.3.Elasticsearch 的一些概念1.3.1.文档和字…

C++之stack 和 queue

目录 前言 1.stack的介绍和使用 1.1 stack的介绍 1.2 stack的使用 1.3 stack 的模拟 2. queue的介绍和使用 2.1 queue的介绍 2.2 queue的使用 2.3 queue的模拟 3.适配器 3.1 什么是适配器 3.2 STL标准库中stack和queue的底层结构 3.3 deque 的介绍&#xff08;了解&…

智慧城市主要运营模式分析

(一)运营模式演变 作为新一代信息化技术落地应用的新事物,智慧城市在建设模式方面借鉴了大量工程建设的经验,如平行发包(DBB,Design-Bid-Build)、EPC工程总承包、PPP等模式等,这些模式在不同的发展阶段和条件下发挥了重要作用。 在智慧城市发展模式从政府主导、以建为主、…

一日连发两款视频大模型,火山引擎杀疯了!

9月24日&#xff0c;字节跳动旗下火山引擎在深圳举办AI创新巡展&#xff0c;并首次对外发布豆包视频生成-PixelDance、豆包视频生成-Seaweed两款AI大模型&#xff0c;并公布了多项AI大模型的全新升级&#xff0c;以一种全新的姿态迎接AI时代的到来。 雷科技此次受邀参与巡展&a…

David律所代理Jose Martin幽默水果版权首发维权,尚未TRO

案件基本情况&#xff1a;起诉时间&#xff1a;2024/9/18案件号&#xff1a;2024-cv-08484原告&#xff1a;Jose Martin原告律所&#xff1a;David起诉地&#xff1a;伊利诺伊州北部法院涉案商标/版权&#xff1a;原告品牌简介&#xff1a;西班牙的卓越艺术家Jose Martin以他非…

深度学习:常见损失函数简介--名称、作用和用法

目录 1. L1 Loss 2. NLL Loss (Negative Log Likelihood Loss) 3. NLLLoss2d 4. Gaussian NLL Loss 5. MSE Loss (Mean Squared Error Loss) 6. BCE Loss (Binary Cross-Entropy Loss) 7. Smooth L1 Loss 8. Cross Entropy Loss 1. L1 Loss 作用&#xff1a;计算预测值…

数据结构(Day18)

一、周学习内容 1、9.18 数据结构&#xff08;Day15&#xff09;-CSDN博客 2、9.19 数据结构&#xff08;Day16&#xff09;-CSDN博客 3、9.20 链表 目的 插入删除不需要移动任何节点&#xff08;元素&#xff09;。 不需要预估存储空间大小&#xff0c;长度动态增长或减小。…

jQuery——jQuery的2把利器

1、jQuery 核心函数 ① 简称&#xff1a;jQuery 函数&#xff0c;即为 $ 或者 jQuery ② jQuery 库向外直接暴露的是 $ 或者 jQuery ③ 引入 jQuery 库后&#xff0c;直接使用 $ 即可 当函数用&#xff1a;$&#xff08;xxx&#xff09; 当对象用&#xff1a;$.xxx&#x…

类与对象—python

一、类的含义 1.1类的作用&#xff08;理解&#xff09; 收集学生信息时&#xff0c;如果让同学们自主填写&#xff0c;信息的顺序、格式不一&#xff0c;内容混乱。如果发给同学们既定的表格&#xff0c;同学们按照规定的顺序、格式进行填写&#xff0c;那信息就会一目了然&…

深度学习03-神经网络01-什么是神经网络?

神经网络的基本概念 人工神经网络&#xff08;Artificial Neural Network&#xff0c;ANN&#xff09;&#xff1a; 是一种模仿生物神经网络的计算模型。由多个神经元&#xff08;或称为节点&#xff09;组成&#xff0c;这些节点通过不同的连接来传递信息。 每个神经元可以接…

Git从了解到操作

Git常用命令 基本的linux命令 ls / ll 查看当前目录( ls 是查看目录有哪些文件夹&#xff0c;ll 是查看隐藏文件)cat 查看文件内容touch 创建文件vi vi编辑器 (使用 vi 编辑器是为了方便展示效果&#xff0c;也可以记事本、editPlus、notPad等其它编辑器) 备注 Git GUl: Gi…

html TAB、table生成

1. 代码 <!DOCTYPE html> <head> <meta charset"UTF-8"> <title>Dynamic Tabs with Table Data</title> <style> /* 简单的样式 */ .tab-content { display: none; border: 10px solid #ccc; padding: 30px; mar…

全志A133 android10 适配EC20 4G模块

一&#xff0c;移植适配 1. 驱动移植 代码路径&#xff1a;longan/kernel/linux-4.9/drivers/usb/serial/option.c diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 9f96dd2..2f25466 100644 --- a/drivers/usb/serial/option.cb/drivers/us…

单例模式(饿汉式-懒汉式)

我给面试官讲解了单例模式后&#xff0c;他对我竖起了大拇指&#xff01;https://blog.csdn.net/weixin_41949328/article/details/107296517?ops_request_misc%257B%2522request%255Fid%2522%253A%2522FAEE9ABD-432D-416C-98C6-9DD939138DEB%2522%252C%2522scm%2522%253A%252…