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

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<<"转换前:"<<endl;
cout<<"a = "<<a<<endl;
wcout<<"b = "<<b<<endl;
Console::WriteLine("c = " + c);

MarshalString(c, a);
MarshalString(c, b);

cout<<"转换后:"<<endl;
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#初探到此结束了!

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

时间: 2024-08-10 23:30:54

VC++直接操作使用C#类库基本操作的相关文章

VC++中操作XML(MFC、SDK)转

[转]VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++里操作XML有两个库可以用:MSXML和XmlLite.MSXML又细分了两种接口:DOM和SAX2.XP没自带有XmlLite,只自带有2.x.3.x版的MSXML,不支持SAX2(需要MSXML 4.0以上),所以优先使用DOM.DOM是以COM形式提供的,VC++里调用DOM可以分3种方法:1

Linux命令行基础 、 基础命令操作 、 目录文件基本操作

  Linux命令行基础 基础命令使用 目录和文件基本管理 #################################################   一.Linux命令行基础   1. 什么是命令.命令行    命令:能够被Linux系统识别,用来完成某一类功能的指令或程序                           |--> 依赖于Shell解释器,查看:cat/etc/shells 默认为 /bin/bash    命令行:用户输入的命令及相关参数,按Enter键提交的

Python:文件操作总结1——文件基本操作

一.文件的操作流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 二.文件的打开与关闭 A.文件的打开--open函数 语法:open(file[,mode[,buffering[,encoding[,errors[,newline[,closefd=True]]]]]]) [参数说明]: file--文件的位置+文件的名字,需要加引号 [注]:若不指明文件的位置,则默认其位于当前文件夹下 mode--文件的的打开模式 buffering--可以取0,1,

vc++基础班[21]---文件的基本操作之CFile

①.文件的创建.打开.关闭: 文件的创建.打开:CFile::Open 文件的关闭:CFile::Close CFile::modeCreate:以新建方式打开,如果文件不存在,则新建:如果文件已存在,把该文件长度置零,即清除文件原有内容: CFile::modeNoTruncate:以追加方式打开,如果文件存在,打开并且不将文件长度置零,如果文件不存在,会抛出异常. 一般与CFile::modeCreate一起使用,则文件不存在时,新建一个文件:存在就进行追加操作: CFile::modeRe

vc++基础班[22]---文件的基本操作2

MFC 中的 CFile 及其派生类中没有提供直接进行文件的复制操作,因而要借助于SDK API: SDK中的文件相关函数常用的有CopyFile().CreateDirectory().DeleteFile().MoveFile() ①.文件的复制:CopyFile 若要复制文件夹,可以在目标位置新建一文件夹,然后将源文件夹里面的文件进行遍历,一个一个的复制到目标文件夹内即可! ②.文件的重命名或移动 [适用于文件夹]: static CFile::Rename 重命名文件: MoveFile

SQL Server 2008 R2——VC++ ADO 操作

==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性. 未经作者同意请勿修改(包括本声明),保留法律追究的权利. 未经作者同意请勿用于出版.印刷或学术引用. 本文不定期修正完善,为保证内容正确,建议移步原文处阅读. 本文链接:http://www.cnblogs.com/wlsandwho/p/4352764.html =============

VC文件操作

重命名文件: 注意: 该操作对文件夹一样有效! CFileFind Finder; CString sOldPath = _T("D:\\tt.txt"); CString strPath = _T("D:\\tt.txt.BAK"); if(Finder.FindFile(sOldPath)) { AfxMessageBox(_T("重命名完成")); CFile::Rename(sOldPath, strPath); //重命名文件 }els

MySQL数据库操作(2)基本操作

创建数据库:CREATE DATABASE [IF NOT EXISTS] 库名例子:CREATE DATABASE `mydb`;CREATE DATABASE IF NOT EXISTS `mydb`;注意:如果库名已经存在,不加上IF NOT EXISTS则会报错,加上只会警告. 删除数据库:DROP DATABASE [IF EXISTS] 库名;例子:DROP DATABASE `mydb`;DROP DATABASE IF EXISTS `mydb`;注意:如果库名不存在,不加上IF

[转]C#对Excel报表进行操作(读写和基本操作)

//1.添加引用-〉com-〉microsoft excel 11.0 //2.若出现错误:命名空间"Microsoft.Office"中不存在类型或命名空间名称"Interop"(是缺少程序集引用吗?) //解决方法:先删除引用中的Excel,然后找到文件Microsoft.Office.Interop.Excel.dll,手动添加该文件的引用 using System; using System.Data; using System.Reflection; us