




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用托管类库的方式在C#中使用C+编写的类(DLL托管)转自:/starlee/archive/2008/09/02/2864588.aspx现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额。因此很多以前搞VC+开发的人都转向用更强大的VS.Net。在这种情况下,有很多开发人员就面临了如何在C#中使用C+开发好的类的问题。下面就用一个完整的实例来详细说明怎样用托管C+封装一个C+类以提供给C#使用。比如,现在有一个工程名为NativeCppDll的由C+编写的DLL,里面输出了一个CPerson类。下面是具体的代码: /NativeCppDll.h #pragmaonce #ifndefLX_DLL_CLASS_EXPORTS #defineLX_DLL_CLASS_declspec(dllexport) #else #defineLX_DLL_CLASS_declspec(dllimport) #endif classLX_DLL_CLASSCPerson public: CPerson(); CPerson(constwchar_t*pName,constwchar_tcSex,intiAge); voidSetName(constwchar_t*pName); wchar_t*GetName(); voidSetSex(constwchar_tcSex); wchar_tGetSex(); voidSetAge(intiAge); intGetAge(); wchar_t*GetLastError(); private: wchar_tm_szName128; wchar_tm_cSex; intm_iAge; wchar_tm_szLastError128; voidShowError(); ; /NativeCppDll.cpp #includestdafx.h #includeNativeCppDll.h #include #include usingnamespacestd; CPerson:CPerson() wcscpy_s(m_szName,_T(NoName); m_cSex=N; m_iAge=0; wcscpy_s(m_szLastError,_T(NoError); CPerson:CPerson(constwchar_t*pName,constwchar_tcSex,intiAge) wcscpy_s(m_szLastError,_T(NoError); SetName(pName); SetSex(cSex); SetAge(iAge); voidCPerson:SetName(constwchar_t*pName) if(pName=NULL)|(wcslen(pName)=0)|(wcslen(pName)127) wcscpy_s(m_szName,_T(NoName); wcscpy_s(m_szLastError,_T(Thelengthoftheinputnameisoutofrange.); ShowError(); return; wcscpy_s(m_szName,pName); wchar_t*CPerson:GetName() returnm_szName; voidCPerson:SetSex(constwchar_tcSex) if(cSex!=F)&(cSex!=M)&(cSex!=m)&(cSex!=f) m_cSex=N; wcscpy_s(m_szLastError,_T(TheinputsexisoutofF/M.); ShowError(); return; m_cSex=cSex; wchar_tCPerson:GetSex() returnm_cSex; voidCPerson:SetAge(intiAge) if(iAge150) m_iAge=0; wcscpy_s(m_szLastError,_T(Theinputageisoutofrange.); ShowError(); return; m_iAge=iAge; intCPerson:GetAge() returnm_iAge; wchar_t*CPerson:GetLastError() returnm_szLastError; voidCPerson:ShowError() cerrm_szLastErrorendl; 这是一个很典型的由C+开发的DLL,输出一个完整的C+类。如果现在要求开发一个C#工程,需要用到这个DLL中输出的C+类CPerson,该怎么办呢?针对这个例子来说,类CPerson非常小,可以用C#重新写一个跟这个C+类一样的类。可是,如果需要的C+类很大,或者很多的时候,重写工程将非常庞大。而且这样没有对现有的代码进行重用,浪费了现有资源,开发起来费时费力。当然,还是有方法解决这个问题的。那就是用托管C+将C+类给封装一下,然后再提供给C#来使用。下面就用代码来详细说明怎样用托管C+来封装上面的那个C+类。首先,要创建一个托管C+的DLL工程ManageCppDll,然后在里面添加下面的代码:/ManageCppDll.h #pragmaonce #defineLX_DLL_CLASS_EXPORTS #include.NativeCppDllNativeCppDll.h usingnamespaceSystem; namespaceManageCppDll publicrefclassPerson /包装所有类CPerson的公有成员函数 public: Person(); Person(StringstrName,CharcSex,intiAge); Person(); propertyStringName voidset(StringstrName); Stringget(); propertyCharSex voidset(CharcSex); Charget(); propertyintAge voidset(intiAge); intget(); StringGetLastError(); private: /类CPerson的指针,用来调用类CPerson的成员函数 CPerson*m_pImp; ; ; 从这个头文件就能看出来,这是对C+类CPerson的包装。类Person的所有公有成员函数都跟C+类CPerson一样,只不过成员函数的参数和返回值就改成了托管C+的类型,这也是让类Person能在C#中使用的首要条件。当然只需要对公有成员函数进行封装,对于保护成员函数和私有成员函数则不必做任何封装。类Person仅有一个私有的成员变量:一个类CPerson的指针。而类Person的所有成员函数的实现都是靠这个CPerson指针来调用类CPerson的相应成员函数来实现。 下面是具体的实现代码:/ManageCppDll.cpp #includestdafx.h #includeManageCppDll.h #include namespaceManageCppDll /在构造函数中创建类CPerson的对象并在析构函数中将该对象销毁 /所有的成员函数实现都是通过指针m_pImp调用类CPerson的相应成员函数实现 Person:Person() m_pImp=newCPerson(); Person:Person(StringstrName,CharcSex,intiAge) /将string转换成C+能识别的指针 pin_ptrwcName=PtrToStringChars(strName); m_pImp=newCPerson(wcName,cSex,iAge); Person:Person() /在析构函数中删除CPerson对象 deletem_pImp; voidPerson:Name:set(StringstrName) pin_ptrwcName=PtrToStringChars(strName); m_pImp-SetName(wcName); StringPerson:Name:get() returngcnewString(m_pImp-GetName(); voidPerson:Sex:set(CharcSex) m_pImp-SetSex(cSex); CharPerson:Sex:get() returnm_pImp-GetSex(); voidPerson:Age:set(intiAge) m_pImp-SetAge(iAge); intPerson:Age:get() returnm_pImp-GetAge(); StringPerson:GetLastError() returngcnewString(m_pImp-GetLastError(); ; 如果要在C#中使用类Person,首先要添加对ManageCppDll.dll的引用,然后就可以像用普通的C#类一样的使用类Person了。比如下面这样的代码:usingManageCppDll; Personperson=newPerson(); person.Name=StarLee; person.Sex=M; person.Age=28; 熟悉设计模式的看了上面的代码肯定会发现,这样的设计跟BRIDGE模式如出一辙。其实,上面的方法也算是一种BRIDGE模式,由托管C+充当了C# 中使用用C+开发的类的桥梁。另外,这种形式也可以理解为ADAPTER模式,托管C+类Person就是C+类CPerson的一个适配器。通过这个桥梁,可以很容易的重用以前用C+开发的类,让这些C+类继续在C#中发挥它们的效用,让开发变得事半功倍。、/xiaobing测试历程、(1)NativeDll项目: 项目属性Win32类型的Win32项目(DLL动态链接库,输出符号) 直接添加CPerson类(包括文件NativeCppDll.h和NativeCppDll.cpp) 编译运行,即可生成非托管的动态链接库(NativeDll.dll和NativeDll.lib)(2)ManageCppDll项目: 项目属性CLR类型的类库项目 直接直接修改成Person类(包括文件ManageCppDll.h和ManageCppDll.cpp,CLR类型的类库项目的结构很清晰,修改较为容易) 设置VC+的目录之库目录,使之包含NativeDll.lib所在的目
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车间生产安全培训内容概述
- 血液采集保存运输操作标准
- 白银资源高效利用-洞察与解读
- 小学数学阶梯练习题库及解析
- 2025-2030数字化病理检测系统质量评估与行业分析
- 2025-2030教育公益项目运营模式与社会价值评估报告
- 2025-2030抗衰老营养补充剂临床证据体系构建与营销合规指引报告
- 2025-2030抗菌药物管理新政对医药企业研发方向的引导作用分析报告
- 2025-2030抗菌功能性免漆门技术突破与市场前景
- 2025-2030抗帕金森药物技术演进与市场渗透率预测报告
- 煤棚安全操作培训课件
- 国家创伤医学中心设置标准
- 金融领域职业生涯规划书3000字范文
- GB/T 4699.2-2025铬铁、硅铬合金、氮化铬铁和高氮铬铁铬含量的测定过硫酸铵氧化滴定法和电位滴定法
- 2025红十字救护员理论考核试题及答案
- 2025秋统编版(2024)小学道德与法治二年级上册(全册)课时练习及答案(附目录)
- 2025年特种设备作业人员考试特种设备操作安全培训课程试题及答案试卷
- 穴位贴敷操作技术
- 2025年四川省基层法律服务工作者执业核准考试历年参考题库含答案详解(5套)
- 露天煤矿应急救援
- 2025中国高血压防治指南
评论
0/150
提交评论