VC编程之VC++直接操作使用C#类库基本操作
小标 2018-08-28 来源 : 阅读 1154 评论 0

摘要:本文主要向大家介绍了VC编程之VC++直接操作使用C#类库基本操作,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之VC++直接操作使用C#类库基本操作,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

   C#简单易操作,而且有比较丰富的类库, 方便处理各种情况,比如来说处理字符串,我觉得用C#就比较的方便,或者是用java之类的,用C++处理起来感觉比较繁琐,所以在用VC进行编程的时候放着C#不用感觉蛮可惜,好了,废话不多说,进入正题!
 
开发环境:VS2005,VC++
项目:VC++ MFC
1,使用的环境条件
新建一个VC++的项目:
首先环境配置,右键项目-->属性-->配置属性-->常规-->找到右边的:
字符集,将其设置为:使用多字节字符集
公共语言运行库支持,将其设置为:公共语言运行库支持(/clr)
 
2,命名空间的引用
在需要使用C#的文件中进行引用C#的命名空间
比如引用C#的System这个类库:
using namespace System;
但是如果是想要引用自己写的类库怎么办呢?
还有一个方法可以实现这类的调用,首先将C#生成一个dll
然后在VC++中如下引用这个dll
#using "../xx/mydll.dll"
引用完dll就如上面引用系统库来对自己的库进行引用了
using namespace mydll;
 
总结注意:
VC++的引用只支持到一级包的引用,对于二级以上的不能采用类似如下的方法进行引用
比如需要一用System.Data错误引用方法:using namespace system.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.equals('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转换到os
void 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转换到os
void MarshalString ( String ^ s, wstring& os ) {
    using namespace Runtime::InteropServices;
    const wchar_t* chars = (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();
    
    os = chars;
    Marshal::FreeHGlobal(IntPtr((void*)chars));
}
测试样例:
string a = "test";
wstring b = L"test2";
String ^ c = gcnew String("abcd");

cout<<"转换前: a="<<a<<endl;<br/>wcout<<" b="<<b<<endl;<br/>Console::WriteLine(" c=" + c);<br/> <br/>MarshalString(c, a);<br/>MarshalString(c, b);<br/><br/>cout<<" 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转换为CString
CString StringToCString(String^ str){
    CString cStr = CString((String^)str);
    return cStr;
}

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

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

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved