您的位置:首页 > 编程语言 > C语言/C++

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

2015-09-24 11:35 786 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: