1.怎样创建C++/CLI程序
C#和C++是非常相似的两种语言,然而我们却常常将其用于两种不同的地方,C#得益于其简洁的语法和丰富的类库,常用来构建业务系统。C++则具有底层API的访问能力和拔尖的执行效率,往往用于访问底层模块和构建有性能要求的算法。
这两种场景看起来有较大的差异,大多数的时候可以各行其道。但还是有很多时候会出现融合的情况。当我们构建分布式系统的时候,由于RPC机制一般都是语言无关的,我们大可以将其各尽所长,按需划分在最能发挥其长处的位置。然而,一旦我们需要构建融合两者需求的集中式系统的时候,就会头痛无比。
此时,我们可以使用C++/CLI搭建C++和.Net之间的桥梁,C++/CLI是一个比较有意思的两栖模块,它具有如下特点
既可以访问.Net类库,也可以访问C++原生类库
既可以被.Net程序引用,也可以被C++原生程序引用
使用C++/CLI,我们可以使用C++编写算法,用C#编写界面,也可以使用.Net Framework类库增强C++程序功能,各取所长。关于的优点,园子里有篇文章介绍的比较详细,值得一读:从C++到C++/CLI。
下面我们就以一个简单的例子来演示一下它的用法:
Calculator.h:
#pragma once
namespace CppCliTest
{
public ref class Calculator
{
public:
int Add(int a, int b);
};
}
Calculator.cpp
#include "stdafx.h"
#include "Calculator.h"
namespace CppCliTest
{
int Calculator::Add(int a, int b)
{
return a + b;
}
}
main.cpp
#include "stdafx.h"
#include "Calculator.h"
using namespace System;
using namespace CppCliTest;
int main(array<System::String ^> ^args)
{
Calculator^ calculator = gcnew Calculator();
int result = calculator->Add(3, 2);
Console::WriteLine(L"Result is {0}", result);
return 0;
}
从这个例子中,我们可以简单的管中窥豹的看看C++/CLI是在C++的基础上扩充了一套语法,使其具有访问.Net原始的功能,这里用到的有:
使用ref class声明CLI引用类型(C#中的class)
使用^(例如如这里的String ^)来定义CLI引用类型
使用gcnew创建CLI的引用类型
2.如何编写高性能 CLI 程序的简要分析
可提高 CLI 程序性能的一些技术及实例分析 实例的测试环境 本文中,所有实例都是在以下的环境中测试并得出结论的:Client 与 server 在不同的物理主机上,它们之间通过 1000M 的以太网相连。
不同环境下,测试得到的各个指标的绝对值可能会有所不同,但是我们关注的只是程序优化前后执行所需时间的一个对比,所以只要程序优化前后测试的环境是一样的,测试得到的结果就是有意义的。 各指标的测试结果均为多次测量求平均值。
分离 SQL 语句的 Prepare 与 execute CLI 提供了两种执行 SQL 语句的方法:SQLPrepare() 与 SQLExecute() 顺序的分步执行;使用 SQLExecDirect() 来直接预处理以及执行一个 SQL 语句。 在编写代码的时候,使用 SQLExecDirect() 会使代码显得更简洁和容易操作,但是程序的执行效率也会受到影响。
将 SQL 语句的预处理与执行分别在不同的步骤中完成,当需要再次执行这个 SQL 语句的时候,可以省略 prepare 过程而直接执行。这会在两个方面使性能得到提高:减少网络上请求 - 应答的交互次数以及网络中的数据流量;减少 server 端的数据处理量。
/link?url=rpX9e-_ftjmTs28DYVcpWP-9-4hW_DA0u_8GUmOS8FPV79jUh-msi-4CvfIEu。
3.C++/CLI的枚举类型如何定义 请写一个简单的程序发给我 谢谢
一个CLI
enum类型通常实现为一个值类型,且隐式继承自System::Enum。同样地,此类型的静态与实例成员,它们的基类
System::ValueType与类型的基类System::Object,在CLI enum类型或此类型的任意实例中,都可以访问到
using namespace System;
public enum class Color {Black, White, Red};
public enum class TransactionType :
unsigned char {Deposit, Withdrawal, Transfer};
int main()
{
Color c = Color::White;
/*1*/ Console::WriteLine("Color::Red's name is >{0}<",
Enum::GetName(c.GetType(), Color::Red));
Console::Write("Color's members are:");
/*2*/ array<String^>^ names = Enum::GetNames(Type::GetType("Color"));
for each (String^ s in names)
{
Console::Write(" {0}", s);
}
Console::WriteLine();
/*3*/ Console::WriteLine("The type underlying Color is >{0}<",
Enum::GetUnderlyingType(Color::typeid));
/*4*/ Console::WriteLine("The type underlying TransactionType is >{0}<",
Enum::GetUnderlyingType(TransactionType::typeid));
}
/////来自编程中国
4.怎样用C++/CLI编写一个保存文档文件时候对其加密,打开的时候又解
用向导新建托管c++的类库,即dll,在需要的地方包含非托管代码的头文件,在托管dll工程属性里面,链接-》输入中填入非托管dll的lib文件,无论是添加引用路径还是输入全路径,保证文件都能找到。然后再托管代码的导出函数里面调用非托管代码的函数就行了。将非托管dll考到输出目录就ok了。托管代码中有些地方可能还需要显示的非托管标记,以及什么允许非托管代码的什么设置之类的忘了怎么写了。
__declspec(dllexport) int fndlltest(void);//非托管函数
托管dll
include "dlltest.h"
using namespace System;
namespace cppdllDotNet {
public ref class Class1
{// TODO: 在此处添加此类的方法。
public: static void MyFun()};}
测试程序:
/ CLRCPPConsol.cpp: 主项目文件。
#include "stdafx.h"
using namespace System;
int main(array^args)
{
Console::WriteLine(L"Hello World");
cppdllDotNet::Class1::MyFun();//!!!!
return 0;
}
5.MASM 怎么用..
汇编语言程序格式及MASM 汇编语言的实现也是先利用某种编辑器编写汇编语言源程序(*.ASM),然后经过汇编得到目标模块文件(*.OBJ)、连接后形成可执行文件(*.EXE)。
1、汇编语言程序的语句格式 汇编语源程序由语句序列构成。语句一般由分隔符分成的四个部分组成,它们有两种格式: (1)执行性语句——由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中: 标号:硬指令助记符 操作数,操作数 ;注释 (2)说明性语句——由伪指令构成的语句,它通常指示汇编程序如何汇编源程序: 名字 伪指令助记符 参数,参数,。
;注释 ◆执行性语句中,冒号前的标号反映该指令的逻辑地址;说明性语句中的名字可以是变量名、段名、子程序名或宏名等等,既反映逻辑地址又具有自身的各种属性。标号和名字很容易通过是否具有冒号来区分。
◆硬指令助记符可以是任何一条处理器指令,也可以是一条宏指令,伪指令助记符主要完成一些不产生CPU动作的说明性工作,在程序执行前由汇编程序完成处理。 ◆处理器指令的操作数可以是立即数、寄存器和存储单元。
伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号隔开。 ◆语句中由分号开始的部分是注释。
2、汇编语言源程序 这个以前已经学过,主要有简化段定义格式和完整段定义格式 3、宏汇编程序MASM MASM6.11,安装文件5张软盘,默认安装在C:\MASM目录下,完整的MASM汇编系统包含很多文件,但最基本的有如下几个: ML.EXE 汇编程序 ML.ERR 汇编错误信息文件 DOSXNT.EXE MS-DOS扩展文件 LINK.EXE 连接文件 LIB.EXE 子程序库管理文件 如果采用集成开发环境PWB,主要涉及如下文件: PWWB.EXE 程序员工作平台 NMAKER.EXE 工程维护程序 NMAKE.EXE nmaker的MS-DOS扩展驱动程序 CV.EXE 源代码调试器CodeView CVPACK.EXE 调试信息压缩器,它为CODEVIEW准备一个可执行文件 HELPMAKE.EXE 帮助文件维护程序 BSCMAKE.EXE 浏览数据库创建程序 SBRPACK.EXE 浏览信息程序 PWBRMAKE.EXE BSCMAKE兼容驱动程序 *.MXT 各种PWB扩展工具文件 *.XXT 各种语言的PWB扩展文件 4、汇编语言的命令行开发过程 (1)原程序的编写 用编辑软件书写*.asm源程序,如 LI6-1.ASM ;LI6-1.ASM .MODEL SMALL .STACK .DATA STRING DB 'Hello,Everybody!' .CODE .STARTUP MOV DX,OFFSET STRING MOV AH,9 INT 21H .EXIT 0 END (2)原程序的汇编 汇编是将原程序翻译成由机器代码组成的目标模块文件的过程,如下: ML /c LI6-1.ASM 如果源程序没有语法错误,则生成一个目标模块文件LI6-1.OBJ (3)目标文件的连接 连接程序能把一个或多个目标文件和库文件和成一个可执行文件(.EXE、.COM文件),如下: LINK LI6-1.OBJ 连接程序的一般格式: LINK [/参数选项] OBJ文件列表 [EXE文件名,MAP文件名,库文件][;] 连接程序可以将多个模块文件连接起来,形成一个可执行文件;多个模块文件用“+”分隔。给出EE文件名就可以替代与第一个模块文件名相同的缺省名。
给出MAP文件名将创建连接映像文件,否则不生成映像文件。库文件是指连接程序需要的子程序库等。
“;”表示采用缺省值 事实上,ML汇编程序可以自动调用LINK连接程序(ML表示MASM和LINK),实现汇编和连接依次进行,如下即可完成可执行文件的生成: ML LI6-1.ASM ML的命令行格式如下: ML [/参数选项] 文件列表 [/LINK连接参数选项] 参数选项如下(注意参数是大小写敏感的): /AT——允许tiny存储模式(创建一个COM文件) /c——只汇编源程序,不进行自动连接 /fl 文件名——川建一个汇编列表文件(扩展名LST) /Fr 文件名——创建一个可在PWB下浏览的.SBR源浏览文件 /Fo 文件名——根据指定的文件名生成模块文件,而不是采用缺省名 /Fe 文件名——根据指定的文件名生成可执行文件,而不是采用缺省名 /Fm 文件名——创建一个连接映像文件(扩展名MAP) /I 路径名——设置需要包含进(INCLUDE)源程序的文件的所在路径 /Sg——在生成的文件列表文件中,列出由汇编程序产生的指令 /Sn——在创建列表文件时不产生符号表 /Zi——生成模块文件时,加入调试程序CODEVIEW需要的信息 /Zs——只进行语法检查,不产生任何代码 /LINK——传递给连接程序LINK的参数 列表文件是一种文本文件,含有源程序和目标代码,创建列表文件,输入如下命令: ML /Fl /Sg LI6-1.ASM 该命令除产生模块文件LI6-1.OBJ和可执行文件LI6-1.EXE,还产生列表文件LI6-1.LST,采用/Sg,如果源程序具有.STARTUP、.EXIT伪指令以及流程控制伪指令.IF、.WHILE等,将在列表文件中得到相应的硬指令;否则列表文件只给出上述伪指令。LI6-1.LST如下: li6-1.lst Microsoft (R) Macro Assembler Version 6.11 08/10/05 14:09:13 li6-1.asm Page 1 - 1 ;LI6-1.ASM .MODEL SMALL .STACK 0000 .DATA 0000 48 65 6C 6C 6F 2C STRING DB 'Hello,Everybody!' 45 76 65 72 79 62 6F 64 79 21 0000 .CODE .STARTUP 0000 *@Startup: 0000 BA ---- R * mov dx, DGROUP 。