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

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


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对象, 并在控制台打印出这个对象:

 

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

 

结果如图:

\

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

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

 

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

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

?
1
2
3
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对象,并将其打印出来:

?
1
2
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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//将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));
}

测试样例:

?
1
2
3
4
5
6
7
8
9
10
11
string a = "test" ;
wstring b = L "test2" ;
String ^ c = gcnew String( "abcd" );
 
cout<< "转换前:" <<endl; a="<< a << endl;
wcout<< " a:=" " b=" " b:=" " c=" + c);
  
MarshalString(c, a);
MarshalString(c, b);
 
cout<< " c--=" " string=" " string:=" " to=" " wstring:=" "></endl;>

结果如图:

\

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

 

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

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

?
1
2
3
4
5
6
7
8
9
10
11
//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#初探到此结束了!

做个笔记记录下这个过程,也让有需求的人少走弯路!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值