‘壹’ 哪位大神能提供下BF或者CF的全部CLI指令
为什么CF进不去,进去后出个Client file corruption detected,clossing game cli 按了就出来了。而且重新安装还是这样 系统是新装的win7旗舰版64位 求大神
‘贰’ C++/CLI的语法
C++/CLI(CLI:Common Language Infrastructure)是一门用来代替C++托管扩展(下文使用MC++指代)新的语言规范。重新简化了C++托管扩展的语法,提供了更好的代码可读性。和微软.NET的其他语言一样,微软向ECMA提交了C++/CLI的标准。C++/CLI现在可以在Visual C++ 2005上开发。C++/CLI的部分特性已经申请了专利。
1 语法改变
C++/CLI是一门独立的语言(比如新的关键字),而不是像C++托管扩展一样是C++的超集 (C++托管扩展有一些不标志的关键字如__gc和__value)。所以,C++/CLI对于这些语法有较大的改变,尤其是去除了一些意义不明确的关键字,增加了一些.NET的特性.
很多不一致的语法,像MC++的不同版本用法的操作符new()被区分开:在C++/CLI,.NET引用类型的创建要使用新的关键字gcnew。并且C++/CLI增加了新的泛型概念(与C++ templates相似,但还是有很大的区别)。
句柄(Handle)
回到MC++,有两类指针: 用__nogc标识的指针是传统意义上的C++指针,而用__gc标识的指针为.NET中的引用。但在C++/CLI里,唯一的指针就是传统意义上的C++指针,而.NET引用类型使用一个“句柄”来获取,使用新的语法“类名^”代替了MC++的“类名*”。新的句法使得托管和非托管代码混合开发更加方便;它指明了对象将会被垃圾回收器自动销毁还是手动销毁。
范例代码:
// C++托管扩展
#using <mscorlib.dll>
using namespace System::Collections;
__gc class referencetype
{
protected:
String* stringVar;
int intArr __gc[];
ArrayList* doubleList;
public:
referencetype(String* str,int* pointer,int number) // 哪个是托管的?
{
doubleList = new ArrayList();
System::Console::WriteLine(str->Trim() + number.ToString());
}
};
// C++/CLI
#using <mscorlib.dll>
using namespace System::Collections::Generic;
ref class referencetype
{
protected:
String^ stringVar;
array<int> intArr;
List<double>^ doubleList;
public:
referencetype(String^ str,int* pointer,int number) // 不会再分不清了吧?
{
doubleList = gcnew List<double>();
System::Console::WriteLine(str->Trim() + number);
}
};
⒈2 跟踪引用(Tracking reference)
C++/CLI里的一个“跟踪引用”也是一个句柄,但它是传地址而不是传值。等同于在C#中加了“ref”关键字,或Visual Basic .NET的“ByRef”。C++/CLI使用“^%”语法来定义一个跟踪引用。与传统C++中的“*&;”语法相似。
下面的示例了“跟踪引用”的使用。如果把“^%”改成“^”(也就是使用普通的句柄),10个字符串将不会被修改,而只会生成那些字符串的副本,这些都是因为那些引用已经不是传地址而是传值。
int main()
{
array<String^>^ arr = gcnew array<String^>;⑽;
int i = 0;
for each(String^% s in arr)
s = gcnew String(i++.ToString());
return 0;
}
上面的代码示例了用户如何用C++/CLI做一些其他.NET语言不能做的事情,比如C#就不允许在foreach循环中这样做。例如foreach(ref string s in arr)在C#中是非法的。
⒈3 析构(Finalizer/Destructor)
C++/CLI的另一个变化就是使用“!类名()”来声明一个托管类型的“析构方法”(在垃圾回收器回收对象之前的不确定的时间由CLR调用),而原来的“~类名()”是用来定义“传统的析构函数”(能被用户自己调用)。另外,下面的例子说明了如何在C++/CLI中托管对象如何自动调用“传统析构函数”。
在一个典型的.NET程序中(例如直接使用CIL)编程,可以由用户自己调用的“析构方法”是用实现IDisposable接口,通过编写Dispose方法来实现显式释放资源;而不确定的“析构方法”是通过重载Finalize函数来实现的。
// C++/CLI
ref class MyClass // :IDisposable (编译器自动实现IDisposable接口)
{
public:
MyClass(); // 构造函数
~MyClass(); // (确定的) 析构函数 (编译器使用IDisposable.Dispose来实现)
protected:
!MyClass(); // 析构方法 (不确定的) (编译器通过重载virtual void Finalize来实现)
public:
static void Test()
{
MyClass auto; // 这不是个句柄,它将调用MyClass的默认构造函数
// 使用auto对象
// 函数返回前自动调用auto的析构函数(IDisposable.Dispose,由~MyClass()定义)来释放资源
// 以上代码等效于:
MyClass^ user = gcnew MyClass();
try { /* 使用auto对象 */ }
finally { delete user; /* 由编译器调用auto.Dispose() */ }
}
};
// C#
class MyClass : IDisposable
{
public MyClass() {} // 构造函数
~MyClass() {} // 析构方法 (不确定的) (编译器通过重载virtual void Finalize来实现),与C++/CLI的!MyClass()等效
public void Dispose() {} // Dispose方法
public static void Test()
{
using(MyClass auto = new MyClass())
{ /* 使用auto对象 */ }
// 因为使用了using句法,编译器自动调用auto.Dispose()
// 以上代码等效于:
MyClass user = new MyClass();
try { /* 使用user对象 */ }
finally { user.Dispose(); }
}
}
‘叁’ 怎样创建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的引用类型
‘肆’ angular-cli怎么编译
package.json文件中scripte底下有命令介绍了编译命令。
例如:npm build
‘伍’ 汇编语言指令大全,要详细的 !!!!
一、数据位传送指令:
1、MOV C, bit ;bit 可直接寻址位 C←(bit)
2、MOV bit,C ;C 进位位 (bit) ← C
二、位变量修改指令:
1、CLR C ; 将C=0
2、CLR bit
3、CPL C ; 将C求反再存入C
4、CPL bit ; 将bit求反再存入bit
5、SETB C ; 将C=1
6、SETB bit ; (bit) ← 1
三、位变量逻辑指令:
ANL C, bit ANL C, bit ORL C, bit ORL C, bit
‘陆’ CLI、STI 汇编指令有什么作用
CLI汇编指令全称为Clear Interupt,该指令的作用是禁止中断发生,在CLI起效之后,所有外部中断都被屏蔽,这样可以保证当前运行的代码不被打断,起到保护代码运行的作用。
STI汇编指令全称为Set Interupt,该指令的作用是允许中断发生,在STI起效之后,所有外部中断都被恢复,这样可以打破被保护代码的运行,允许硬件中断转而处理中断的作用。
CLI和STI汇编指令只能在内核模式下执行,不可以在用户模式下执行;而且在内核模式下执行时,应该尽可能快的恢复中断,因为CLI会禁用硬件中断,若长时间禁止中断会影响其他动作的执行(如移动鼠标等等),系统就会变得不稳定。
其次,在标志寄存器中中断标志清零的情况下,可以以“int ××”的形式调用软中断。序员可以改变段地址和偏移地址,但是在这个过程中如果需要改变段寄存器SS和SP必须禁止中断,当改变完成后即可恢复中断(在cli指令后需要有与其配对的sti指令,否则计算机会崩溃)。
‘柒’ C#语言经编译后得到的是汇编指令机器指令本机指令CIL中间语言指令
C#是解释型语言,不是编译型语言。
只要不是"直接编译成机器指令并直接运行机器指令执行档"的编译语言,就属于解释语言。
Java,C#、VB.net等的源码先编译成字节码,再由虚拟机“解释”执行字节码。
因此 C#语言经编译后得到的是CIL中间语言指令 即字节码
呵呵 满意就选满意回答啊
‘捌’ C++/CLI的语言学习
在设计C++/CLI语言中涉及三个方面问题,这同样贯彻于所有的其他程序开发语言:一是语言级的语法向底层通用类型系统(简称CTS)的映射;二是向程序开发人员提供的CLI的底层细节结构的级别选择;三是超越CLI的直接支持,提供额外的功能性函数的选择。
第一条对于所有的CLI语言来说都大致相同,第二条和第三条对于不同的CLI语言来说是不同的,相互区别的。根据你需要解决什么样的问题,你将选择这种或那种语言,也有可能混合使用多种CLI语言。学习C++/CLI涉及到了解它在设计过程中的所有这些涉及方面。 ⒈ Visual C++ 2008 大学教程(第二版)(英文原版:Visual C++ 2008 How to Program,Second Edition)
⒉ Visual C++ 2008入门经典 (英文原版:Beginning Visual C++ 2008)
⒊ C++/CLI in Action
⒋ Foundations of C++/CLI The Visual C++ Language for .NET 3.5
⒌ Pro Visual C++/CLI and the .NET 3.5 Platform
⒍ Expert C++/CLI:.NET for Visual C++ Programmers 使用C++/CLI编程时间了解底层的CTS非常重要。CTS包括以下三种常用类的类型:
1、多态引用类型,这正是对于所有继承类所要使用的。
2、非多态值类型,这用于实时高效的具体类型,例如数值类型。
3、抽象的接口类型,这用于定义一个操作集,也可以用于实现接口的引用或值类型集合。
这个设计方面的问题,即将CTS映射到语言内建的数据类型集合,通常同样贯穿于所有的CLI语言,虽然不同的CLI语言语法不同。所以,在C#中你可能这么写:
abstract class Shape { ... } // C#
来定义了一个Shape基类,从该类将导出几何对象,然而在C++/CLI你将这么写:
ref class Shape abstract { ... }; // C++/CLI
上述代码说明了底层的C++/CLI引用类型。这两种声明在内层代表的意思是一样的。相似地,在C#中你这么写:
struct Point2D { ... } // C#
来定义一个具体的Point2D 类,然而在C++/CLI中这么写:
value class Point2D { ... }; // C++/CLI
C++/CLI支持的类型集合代表了CTS与本地设备的综合,这决定了你的语法选择,例如:
class native {};
value class V {};
ref class R {};
interface class I {};
CTS也支持与本地列举类型稍微不同的列举类类型。当然,对于上述两者CTS是都支持的。例如:
enum native { fail,pass };
enum class CLIEnum : char { fail,pass};
相似地,CTS支持它本身的数组类型,并且它再一次将其与本地数组在行为上区分开来。同时,微软再次为这两种类型提供了支持。
int native[] = { 1,1,2,3,5,8 };
array<int>^ managed = { 1,1,2,3,5,8 };
那种认为一种CLI语言比其他CLI语言在向底层的CTS映射中表现的更出色或更完美都是不确切的,相反,每种不同的CLI语言代表着对CTS底层对象模型的不同理解,在下一节你将更清楚地看到这一点。 设计一个CLI语言时第二个必须要考虑的问题是将CLI的底层执行模式融入到语言的细节级别。这种语言用于解决什么问题?这种语言是否有必须的工具来解决这些问题?这种语言可能吸引什么样的程序开发人员?
例如,值类型存在于托管堆上,在很多情况下值类型可以看到它们自身的存在。
1、通过隐含的加箱操作,当一个值类型的实例被分配给一个对象或当一个虚拟的方法通过一个值类型来调用;
2、当这个值类型被当作应用引用类类型的成员时;
3、当这个值类型 被当作CLI数组成员时;
需要指出的是,这种情况下开发人员是否被允许操作值类型的地址是CLI语言设计时必须应该予以考虑的问题。 在垃圾收集器扫描紧缩状态下,位于托管堆上的任何对象非常可能面对重新定位问题。指向对象的指针可以实时跟踪并修改。开发人员不能自己手动跟踪,所以,如果你获许取得一个可能位于托管堆上的值类型的地址时,除了本地指针外,还需要有一个跟踪形态的指针。
销售商考虑的是什么?那就是需要简单和安全,在语言中直接提供跟踪一个对象或集合的指针使语言复杂化,没有这种支持,将减少复杂程度,可资利用的、潜在的程序开发人群可能会增加,此外,准许程序开发人员操作生命短暂的值类型,增加了错误产生的可能性,程序开发人员可能有意无意地对内存进行错误操作,不支持跟踪指针,一个潜在的更安全地实时环境产生了。
另一方面,效率和灵活性也是必须考虑的一个问题,每一次向同一个对象分配值类型时,一个全新的数值加箱操作发生了,准许存取加箱值类型允许在内存中进行更新,这可能在性能上产生了一个非常巨大的进步。没有跟踪形态的指针,你无法用指针算法重新声明一个CLI数组,这意味着CLI数组不能使用标准模板库进行重新声明,也不能使用一般的算法。准许操作加箱数值使设计具有更大地灵活性。
微软在C++/CLI中选择地址集合模式来处理托管堆上的值类型。
int ival = 1024;
int^ boxedi = ival;
array<int>^ ia = gcnew array<int>{1,1,2,3,5,8};
interior_ptr<int> begin = &ia[0];
value struct smallInt { int m_ival; ... } si;
pin_ptr<int> ppi = &si.m_ival;
典型地C++/CLI开发人员是一个复杂的系统程序员,承担着提供下层内部构造和有组织的应用程序的任务,而这些恰恰是未来商业发展的基础。C++/CLI开发人员必须兼顾可测量性和可执行性,所以必须在系统的高度级上来看待CLI下层结构。CLI细节水平反映了开发人员的脸色。
复杂性本身并不代表对质量的否定,人类比单细胞细菌复杂的多,这当然不是一件坏事,然而,当表达一个简单的概念变的复杂化后,这常常被认为是一件坏事。在C++/CLI中,CLI开发团队已经试着提供一种精巧的方法来表达方式一个复杂的事情。 第三个设计方面是特定功能性的语言层,它远远超过CLI所提供的直接支持,虽然这可能需要在语言层支持和CLI底层执行模式间建立一个映射。但在某些情况下,这恰恰是不可能的,因为语言无法调节CLI的行为。这种情况的例子就是在基类的构造及析构函数中定义虚函数。根据ISO-C++在这种情况下的语言学,需要用每一个基类的构造和虚构函数重新设置虚拟表,而这是不可能的,因为虚拟表句柄是实时管理的,而不是某一个语言来管理。
所以,这个设计方面是在完美性和可行性之间的妥协产物,C++/CLI提供的额外功能主要表现在三个方面:
1、获取资源的一种形式是对于引用类型的初始化,此外,提供一种自动化工具,用于占用较少资源、所谓的可确定性自动消亡的垃圾收集类型对象。
2、一种深度拷贝形式的语法与C++拷贝构造函数和拷贝分配操作符相一致,但其并不适用与值类型。
3、除了最初的一般性CLI机制外,还有对于CTS类型的C++模板直接支持。这些是我第一篇文章中讨论的主题。此外,还提供了针对CLI类型的可校验STL版本。
让我们来看一个简单的例子,一个确定性消亡问题。在垃圾搜集器重新声明一块与对象相关联的内存之前,一个相关的消亡方法,如果存在的话,将被调用。你可以认为这种方法是超级析构函数,因为它与对象的程序生命期无关。这就叫做终结。终结函数是否调用以及什么时间调用都没有明确规定,这就是垃圾收集器的非确定性终结。
在动态内存管理的情况下,非确定性终结工作非常好,当可用内存变的越来越少时,垃圾收集器介入并开始着手解决问题。然而,非决定性终结也有工作不好的时候,当一个对象维护一个重要资源,例如一个数据库连接、锁定某些类别、或者可能是本地的堆内存。在这种情况下,只要是不需要,应立即释放资源。目前CLI所支持的解决问题的方法是,对于一个类通过执行IDisposable接口提供的Dispose方法释放资源。这里的问题是执行Dispose方法需要一个清晰的声明,所以它也就不可能存在调用。
最基本的C++中的设计模式是上述的通过初始化来获取资源,这意味着类使用构造函数来获取资源,相反,类使用析构函数来释放资源。这些行为由类对象在生存期内自动管理。
下面是引用类释放资源时所做的顺序动作:
1、 首先使用析构函数来封装所有与释放类有关的资源时所必须的代码;
2、 析构函数自动调用后,结束类对象的生命期。
对于引用类型来说,CLI没有类析构函数的概念,所以析构函数不得不映射为在底层执行的其它代码。此时,在内部,编译器执行以下操作:
1、 类让其基类列表继承自IDisposable接口;
2、 析构函数转换成IDisposable的Dispose方法。
以上实现了目标的一半,一种实现析构造函数自动调用的方法仍然需要,对于引用类型,一种特殊的基于栈的符号得到支持,也就是说,一个对象的生命期与它的声明范围有关。在内部,编译器将符号转换为在托管堆上分配引用对象。随着作用域的终结,编译器插入一个Dispose方法-用户定义的析构函数。与对象有关的内存的收回在垃圾收集器的控制下得到执行。
C++/CLI并不是将C++拓展到一个托管的世界,更确切的说,它代表一个完全综合的范例,某种程度上就象当初将泛编程模式和多重继承综合进该语言一样。我认为C++/CLI开发小组做了一项非常卓有成效的工作。
‘玖’ C++ /CLI 和 C++ 的区别
1、C++/CLI(CLI:Common Language Infrastructure)是微软设计,用来代替C++托管扩展的语言。这门语言在兼容原有的C++标准的同时,重新简化了托管代码扩展的语法,提供了更好的代码可读性。和微软.NET的其他语言一样,微软向ECMA提交了C++/CLI的标准化请求,并且被ECMA通过成为正式的标准[1]。C++/CLI现在可以被Visual C++2005和更高版本的编译器支持。C++/CLI的部分特性已经申请了专利。
2、C++本来就是兼具面向过程和面向对象的特点。C++/CLI是.net下的规范,编译器先编译为MSIL,也就是所谓的托管代码了。
‘拾’ 汇编语言sti和cli作用
是不是AVR单片机中的,sti置1,cli把全局中断I清0