C++调用C#的Dll实现Xml读写

0.     前言

C#采用Dom文档对象化的方式读写Xml十分简单,简而言之就是直接对类对象进行操作,主要是.net的反射机制相当强大。而C++没有反射机制,所以C++的对象属性无法遍历,因此不能实现对整个类属性的简化操作,需要一个一个属性或变量的处理,C++读写Xml通常的方式就是Sax单个解析,编写代码复杂度的太大,且不易扩展。

 

1.     C#实现Xml读写

写Xml的时候可以不用管是什么类型,只是需要使用o.GetType(),读Xml的时候就要转换成特定读取类型。

public voidWriteXml(objecto,stringpath)

        {

            FileStream fs = null;

            try

            {

               //序列化xml保存

               XmlSerializer serializer = new XmlSerializer(o.GetType());

               fs = newFileStream(path,FileMode.Create);

               serializer.Serialize(fs,o);

               fs.Close();

            }

            catch (Exceptionexception)

            {

               if (fs!=null)

               {

                   fs.Close();

               }

            }

        }

 

public CSharpSchool ReadXml(stringpath)

        {

            FileStream fs = null;

            CSharpSchool T = new CSharpSchool();

            try

            {

               XmlSerializer serializer = new XmlSerializer(typeof(CSharpSchool));

               fs = newFileStream(path,FileMode.Open);

               T = (CSharpSchool)serializer.Deserialize(fs);

            }

            catch (Exceptionexception)

            {

 

            }

            if (fs !=null)

            {

               fs.Close();

            }

            return T;

        }

 

2.     C++调用C#的DLL的过程

简单来说就是C++利用C#对Xml的Dom操作方式来实现xml的读写,由于C++的类不能直接转换为C#的类,所有需要在C++和C#两组类(如:在C++里生成CSchool类,在C#中对应的生成CSharpSchool),同时在调用的时候需要进行类属性的拷贝传递。

过程如下:

写Xml:生成C++的CSchool类对象shool->调用C#的Dll->生成C#的CSharpSchool类对象csSchool->将shool对象属性Copy到csSchool相关属性(可不同名)->对C#的csSchool对象执行Xml的写操作

读Xml:生成C++的CSchool类对象shool->调用C#的Dll->生成C#的CSharpSchool类对象csSchool->对C#的csSchool对象执行Xml的读操作->将csSchool对象属性Copy到school相关属性

 

3.     C#生成的DLL注意事项

C#代码需要将CSharpSchool类写到Dll中,麻烦一点的是如果C++的CSchool对象扩展或修改了属性,对应的需要修改Dll中的CSharpSchool的代码,当然,也可把读写XML封装成一个通用的Dll(需要将读xml函数进行处理降低耦合,写Xml本身就可以很独立),然后将CSharpSchool写到另一个Dll中(该Dll需要调用读写Xml的Dll),这样就需要两个Dll。

对于简单的项目可以就写到一个Dll,因为如果是结构体(或类)改变这样的大事情当然是要谨慎,结构体(或类)改变而造成修改大量代码也是很常见的情况,没有人会随便修改结构体(或类)。

 

4.     C++调用C#的Dll注意事项

首先,需要将工程属性修改一下,修改“属性->配置属性->常规->公共语言运行时支持”项为“公共语言运行时支持(/clr)”。可能需要.net环境,笔者没有验证,估计C++由于需要引用C#的代码,因此在发布的时候需要安装对应的.net环境,由于C#代码本来运行时都需要.net框架,这个也是可以理解的。调试时候笔者用的VS2010环境,本来就安装了.net,因此代码调试不需要关心这个问题。

 

5.     C++调用C#的Dll过程

1)引入C#动态库,采用using方式

#using "..\Debug\CsDll.dll"

 

2)引入需要使用的命名空间

using namespaceCSDll;

 

3)使用C#的Dll中的类

XmlHelper ^xml=gcnewXmlHelper();

使用gcnew创建,C#的类对象到了C++中就是类指针,因此需要一个指针对象,这里不用*(星号)用^(倒三角)表示。

CSharpSchool ^s=gcnewCSharpSchool();

s->nSchoolSrialNo=101;

s->SchoolName=XX大学;

//s->SchoolName=gcnewSystem::String(csSchoolName);

 

6.     C++与C#类型转换注意事项

最需要注意的是string类型,在C#中string类型到了C++应该是一个string的指针,在C++中,特别是MFC中最常见的是CString类型,两者转换如下:

 

C++ CString转换为C#的string方法:

CSharpSchool ^s=gcnewCSharpSchool();

s->SchoolName =gcnewSystem::String(csSchoolName);

(C#中SchoolName是CSherpSchool的属性,类型是string,csSchoolName是C++中的一个CString对象)

         C#的string转换为C++Cstring的方法就比较简单,直接赋值:

         csSchoolName = s->SchoolName;

 

    还有就是bool与BOOL的转换比较简单,int类型转换可能涉及32位64位的问题,其它类型转换就可能复杂一点。

 

测试程序Demo:用的是VS2010

http://download.csdn.net/detail/songly1/9135863

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值