首页 > 编程语言 >CLR组件开发之 基于C++ dll 与C++/CLI dll与C#的数据类型对应关系

CLR组件开发之 基于C++ dll 与C++/CLI dll与C#的数据类型对应关系

时间:2023-07-09 10:45:20浏览次数:43  
标签:long CLI int 数据类型 C++ dll C# Color

  模块化组件化实现独立的功能模块是软件设计的良好习惯,一般用实现为DLL。普通的DLL对外提供接口是采用导出函数接口,如果接口数量不大,只是50个以内,这种方式很适合;如果对外接口有上百个,导出函数接口就完全破坏了软件模块化分层设计的理念,使用接口非常麻烦,此情形采用C++/CLI导出类方式实现比较适合,即核心实现先C++ DLL,然后C++/CLI直接调用C++ DLL导出类,对外第三方工程提供CLI类接口。3种开发语言常用的数据类型对应关系如下表所示:

MFC C++ C++/CLI C# 说明
int int int  
bool bool bool  
byte byte byte  
long long long long long  
int& int% ref int int形参返回值
HWND IntPtr IntPtr  
CString String^ String  
int Color Color 需在CLI工程写int与Color转换函数
long long DateTime DateTime 需在CLI工程写long long
与DateTime转换函数
CChart* CChart* IntPtr  
  CChart^ CChart 都是托管类型对象
  CCurve^ CCurve 都是托管类型对象
  List<CCurve^>^ List<ChartObject> 都是托管类型对象
  CCurve^% ref Ccurve  
  array<Color>^ Color[]  
  property 属性 直接属性取值赋值
       

需要特别说明的是:

1>需要函数形参返回int值时,C++定义为int&,CLI定义为int%,C#定义为ref int。如GetChartSize(int& w, int& h) --> GetChartSize(int% w, int% h) --> GetChartSize(ref int w, ref int h);

2>需要颜色定义时,C++不支持Color只能用int,CLI支持Color,C#支持Color,因为int和Color类型的内存不一样,需要中间层CLI把int 与 Color相互转换(DateTime类型也是如此)。转换函数如下:

 1         static UINT32 Color2UInt(Color color)
 2         {
 3             UINT32 argb = 0;
 4         //    argb += color.A << 24;
 5             argb += color.R << 0;
 6             argb += color.G << 8;
 7             argb += color.B << 16;
 8             return argb;
 9         }
10         static Color UInt2Color(UINT32 c)
11         {
12             Color clr;
13             clr = clr.FromArgb((c >> 0) & 255, (c >> 8) & 255, (c >> 16) & 255);
14             return clr;    
15         }

 

3>CLI类加^,等同于C#的类,都是托管对象。

那么C++对象是怎么与C#对应上的呢?他们无法直接对应,得通过CLI层转换。得在CLI层同时维护C++类指针与CLI类引用,并且让他们关联上。对C#使用CCurve^托管对象,对内维护C++类CCurve*指向的非托管内存。具体请看下一节CLI工程源码。

 

4> 属性的实现。C++使用setXXX和GetXXX函数,CLI使用property即set和get方法,C#直接访问变量。示例如下:

 1 //C++工程 LineCurve.h声明
 2 int m_nLineWidht;
 3 int GetLineWidth();
 4 void SetLineWidth(int w);
 5 
 6 //C++工程 LineCurve.cpp实现
 7 int CLineCurve::GetLineWidth()
 8 {
 9     return m_nLineWidht;
10 }
11 void CLineCurve::SetLineWidth(int w)
12 {
13     m_nLineWidht = w;
14 }
15 
16 
17 //-----------------------------------------------------
18 //CLI工程 LineCurve.h声明
19 property int LineWidth {
20     int get();
21     void set(int value);
22 }
23 
24 //CLI工程 LineCurve.cpp实现
25 int LineCurve::LineWidth::get()
26 {
27     return m_cLineCurve->GetLineWidth();
28 }
29 void LineCurve::LineWidth::set(int value)
30 {
31     m_cLineCurve->SetLineWidth(value);
32 }
33 
34 
35 //-----------------------------------------------------
36 //C#工程
37 LineCurve lcurve = new LineCurve();
38 lcurve.LineWidth = 3;
39 int lw = lcurve.LineWidth;

 


标签:long,CLI,int,数据类型,C++,dll,C#,Color
From: https://www.cnblogs.com/fydraw/p/17538405.html

相关文章

  • 基于MFC dll实现C++/CLI dll组件全过程详解(附完整源码) 浮云绘图
    ​模块化组件化实现独立的功能模块是软件设计的良好习惯,一般用实现为DLL。普通的DLL对外提供接口是采用导出函数接口,如果接口数量不大,只是50个以内,这种方式很适合;如果对外接口有上百个,导出函数接口就完全破坏了软件模块化分层设计的理念,使用接口非常麻烦,此情形采用C++/CLI导出类......
  • c++ day 4
    今天来复习标准模板库当谈到C++的标准库时,STL(StandardTemplateLibrary,标准模板库)是一个重要的组成部分。STL提供了一组通用的模板类和函数,用于实现常见的数据结构和算法。它包括容器(Containers)、迭代器(Iterators)、算法(Algorithms)和函数对象(FunctionObjects)等。第一个STL算法:......
  • c++模板相关学习--泛型编程
     类模板基础#define_CRT_SECURE_NO_WARNINGS#include<iostream>usingnamespacestd;#include<string>template<classNAMETYPE,classAGETYPE=int>//类模板中可以有默认参数classPerson{public:Person(NAMETYPEname,AGETYPEage){......
  • C++ 惯用法之 Copy-Swap 拷贝交换
    C++惯用法之Copy-Swap拷贝交换这是“C++惯用法”合集的第3篇,前面2篇分别介绍了RAII和PIMPL两种惯用法:RAII:ResouceAcquistionIsInitializationPIMPL:PointerToImplemetation正式介绍Copy-Swap之前,先看下《剑指Offer》里的第☝️题:如下为类型CMyString......
  • 2.【初级班】VS环境创建一个简单的程序(C,C++)
    本课知识点C,C++第一个程序生成程序输出窗口生成程序所在目录新建->项目Ctrl+Shift+N C:\Users\Administrator\Source\Repos\L001\Debug\include<stdio.h>voidmain(){printf("我的第一个程序helloworld!");getchar();}voidmain()//001-识记入口函数名main......
  • 音标编码 转unicode输出,VC++
    字典的音标有的是用 KingsoftPhoneticPlain字体,有的是用KK字体,对应的编码也不同,输出时可以设置对应的字体,但是需要安装对应的字体,程序中还要改字体。统一改成UTF16后就可以统一输出了,window程序一般都用UTF16,接口转换也比较方便。对应的转换关系可以在网上找,不过网上的不......
  • C++之在线程间切分任务
    背景在多线程编程中,如何有效地在多个线程间切分任务是一个关键问题。合理地切分任务可以充分发挥多核处理器的性能,提高程序的运行效率。本文将介绍在线程间切分任务的原理和实践,包括任务切分策略、负载均衡、任务同步等方面的内容。任务切分策略在多线程编程中,我们需要根据实际......
  • C++之原子操作:实现高效、安全的多线程编程
    背景在多线程编程中,线程间的同步和数据竞争问题是无法避免的。传统的同步方法,如互斥锁(mutex)和条件变量(conditionvariable),可能导致性能下降和死锁等问题。C++11引入了原子操作,提供了一种更高效、安全的多线程编程方式。本文将介绍C++中的原子操作概念、使用方法及示例。C++中的......
  • C++之深入探讨同步操作与强制次序
    背景在C++多线程编程中,线程间的同步与顺序执行是至关重要的。同步操作可以确保线程间的数据一致性,避免数据竞争和死锁问题。强制次序则可以确保线程间的操作按照预期顺序执行。本文将详细介绍C++多线程编程中的同步关系、先行关系、原子操作的内存顺序、释放序列和同步关系、栅栏......
  • C++之内存模型
    背景C++内存模型是C++程序中内存管理和数据存储的基础。了解C++内存模型的概念和运作机制对于编写高效、安全的C++代码至关重要。本文将详细介绍C++内存模型的基本概念、内存分配策略以及与其相关的代码示例。C++内存模型的基本概念C++内存模型主要包括以下几个部分:静态存储......