VC++直接操作使用C#类库基本操作

来源:互联网 发布:天音网络发展有限公司 编辑:程序博客网 时间:2024/06/06 02:28

VC++ 直接操作使用 C# 类库基本操作:


  C# 简单易操作,而且有比较丰富的类库, 方便处理各种情况,比如来说处理字符串,我觉得用 C# 就比较的

便,或者是用 java 之类的,用 C++ 处理起来感觉比较繁琐,所以在用 VC 进行编程的时候放着 C# 不用感觉

蛮可惜,好了,废话不多说,进入正题!


开发环境: VS2005 , VC++

项目: VC++ MFC


1  使用的环境条件

  新建一个 VC++ 的项目:

首先环境配置,右键项目 --> 属性 --> 配置属性 --> 常规 --> 找到右边的:

字符集,将其设置为:使用多字节字符集

公共语言运行库支持,将其设置为:公共语言运行库支持 (/clr)


2  命名空间的引用

  在需要使用 C# 的文件中进行引用 C# 的命名空间,比如引用 C# 的 System 这个类

库:usingnamespaceSystem;但是如果是想要引用自己写的类库怎么办呢?还有一个方法可以实现这类的调用,首

先将 C# 生成一个 dll然后在 VC++ 中如下引用这个 dll,#using"../xx/mydll.dll"引用完 dll 就如上面引用系

统库来对自己的库进行引用了usingnamespacemydll;

总结注意:

VC++ 的引用只支持到一级包的引用,对于二级以上的不能采用类似如下的方法进行引用。比如需要一用

 System.Data 错误引用方法: usingnamespacesystem.Data;  这是绝对错误的,编译会产生如下错误:

.\TestMFCCSDlg.cpp(8) : error C2143:  语法错误 :  缺少 “;”( 在 “.” 的前面 )所以切记!之后叫你

怎么引用二级包以上里面类的方法!


3  调用 C# 的方法

 在进行引用后那就是 C# 支持库的类和类的方法的调用了!


1 )简单的 C# 打印语句调用

例如:用 C# 在控制台打印出 ”Hello World!”

Console::WriteLine("Hello "+" World!");

结果如图:


从这里我们可以看到这个语法与 C# 的有稍微的不同,这里是采用 C++ 的调用方式来进行 C# 方法的调用

这里是采用 “ :: ” 而不是 “.” 来进行方法的调用!还有需要注意的是 “ :: ” 是调用 C# 的静态方

法(类方法),对于 C# 非静态方法(对象方法)的调用之后会说明!


2 )创建 C# 对象

例如:创建一个 C# 的 String 对象, 并在控制台打印出这个对象:

String^ str = gcnew String("String");Console::WriteLine(str);

结果如图:


从这里我们也可以在 VC++ 中创建 C# 对象与在 C# 环境下的不同 ,

首先,对象的声明得多加一个 “^” 符号,其次这里是用 “gcnew” 来创建对象而不是 “new”


3 )调用 C# 对象的方法(非静态方法)

例如:调用 String 的 Equals 方法,并将比较结果打印出来:

String^ str = gcnew String("String");bool b = str->Equals("String");Console::WriteLine("str = "

 + str+ "--------->str.eq

uals('String')?:" + b);

结果如图:

从这里我们可以看出,调用 C# 对象的方法是采用类似 C 语言的引用方式,用 “->” 来进行对象方

法的调用;


4 )对于 C# 二级包及以上的库的调用

例如:创建 System.Text 包下的 StringBuilder 对象,并将其打印出来:

Text::StringBuilder^ sb = gcnew Text::StringBuilder("StringBuilder");Console::WriteLine("sb = " + 

sb);

结果如图:


从这里我们可以看出,在引用一级包后,对于二级包的对象创建需要用到:(二级包名::对象名)来进行对象的

引用,对于二级以上的

可以这样创建:(二级包名::三级包名::对象名)来进行对象的引用,之后的依此类推!


5 )将 C# 的 String 对象转换成 C++ 的 string 对象

引用自: https://msdn.microsoft.com/zh-cn/library/1b4az623%28VS.80%29.aspx

首先这里给出两个方法,具体的转化方法在这里给出的方法里面有,需要了解原理的可以看下原文或者方法体

// 将 s 转换到 osvoid MarshalString ( String ^ s, string& os ) { using namespace

Runtime::InteropServices; const char*chars = (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer(); os = chars; 

Marshal::FreeHGlobal(IntPtr((void*)chars));}

// 将 s 转换到 osvoid MarshalString ( String ^ s, wstring& os ) { using namespace Runtime::InteropServices; const wchar_t* chars = (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer(); os = chars; Marshal::FreeH

Global(IntPtr((void*)chars));}

测试样例:

string a = "test";wstring b = L"test2";String ^ c = gcnew String("abcd");cout<<" 转换前: "<<<"a = "<<<<<"String to string:

c-->a: a = "<< a << endl;wcout<<"String to wstring: c-->b: b = "<< b << endl;

结果如图:


从这里看出, String 成功转换成 string 和 wstring


6 )在 MFC 中,将 String 转换成 CString 以及将 CString 转换为 String

样例:这里直接给出我写的函数,很简单的一个转换

//String 转换为 CStringCString StringToCString(String^ str){ CString cStr = CString((String^)str); return cStr;}//CString 转换为 StringString^ CStringToString(CString cStr){ String^ str = gcnew String(cStr); return str;}


4  总结

 好了, VC++ 调用 C# 初探到此结束了!做个笔记记录下这个过程,也让有需求的人少走弯路!
原创粉丝点击