CLR只记不看笔记(二) 生成、打包、部署和管理应用程序及类型
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AnySpace { class Demo { static void Main() { Person p = new Person(); p.Name = "一个人"; p.address = new Address("某个地方"); Console.WriteLine(p); } } public class Person { public int Id { get; set; } public string Name { get; set; } public Address address { get; set; } } public class Address { public string address { get; set; } public Address(string address) { this.address = address; } } }
如图,编译命令如下
CSC.exe D:\...\Demo.cs 生成一个CUI程序(控制台用户界面 Console user Interface)
在VS2010安装目录下生成 Demo.exe
若使用csc /t:winexe 开关生成 一个GUI应用程序(图形用户界面)
IL DASM反编译如下图
产生类:Address,Person,Demo
Address 中
.ctor:void(string)对应 此类构造函数
public Address(string address)
{
this.address = address;
}
属性address{get;set;} 生成
.property instance string address() { .get instance string AnySpace.Address::get_address() .set instance void AnySpace.Address::set_address(string) } // end of property Address::address
get_address()对应生成的get_address:string()方法,set_address()生成对应 set_address:(string)方法
其他类型也是如此。
下面看一下程序入口main方法生成的什么?
.method private hidebysig static void Main() cil managed { .entrypoint // 代码大小 44 (0x2c) .maxstack 2 .locals init (class AnySpace.Person V_0) IL_0000: nop IL_0001: newobj instance void AnySpace.Person::.ctor() IL_0006: stloc.0 IL_0007: ldloc.0 IL_0008: ldstr bytearray (00 4E 2A 4E BA 4E ) // .N*N.N IL_000d: callvirt instance void AnySpace.Person::set_Name(string) IL_0012: nop IL_0013: ldloc.0 IL_0014: ldstr bytearray (D0 67 2A 4E 30 57 B9 65 ) // .g*N0W.e IL_0019: newobj instance void AnySpace.Address::.ctor(string) IL_001e: callvirt instance void AnySpace.Person::set_address(class AnySpace.Address) IL_0023: nop IL_0024: ldloc.0 IL_0025: call void [mscorlib]System.Console::WriteLine(object) IL_002a: nop IL_002b: ret } // end of method Demo::Main
第一个行解释:私有方法通过信道隐藏 static void Main()cil managed(CIL管理)好吧,这是啥意思我不太懂 ???
第二行,我看懂了。。entrypoint标记程序入口点。
好吧,其他的就不需要解释了。是Main方法中代码生成的IL代码。
恩,IL DASM貌似很神奇,可以看到一些隐藏的东西,比如属性 原来是这样实现的。那么事件呢?委托呢?辣妹表达式呢?Emit呢?GC清理代码的生成呢?这些以后再慢慢看吧。哈哈 ^_^。
好,以上说了.CS编译成 exe文件。下面说说元数据
元数据分为 定义表和引用元数据表
定义表中定义在此程序集中定义的类型,类型对应的方法,字段,方法的参数,返回类型,此类型的事件等。
引用元数据表为此程序集中引用的类型,引用的程序集名称,该引用类型中引用的类型,应用类型的方法事件参数成员等。
VS IDE 将程序集添加到项目中,略过。
应用程序部署
之前在做winform开发是程序打安装包 是按照在VS中新建项目,项目类型选择“安装和部署项目”,然后将生成的程序集引入到项目中,加上一些 安装路径,资源文件路径等设置,以及打包必要条件等。完成应用程序的部署,生成.MIS的文件。
后来,在VS IDE中发现可以使用ClickOnce技术,CS项目右键解决方案-选择属性-选择发布选项卡,填上发布信息 可以生成MSI文件,将它复制到一个网站、FTP服务器或者文件路径。利用ClickOnce 应用程序还能自动检查更新,根据填写的版本号。
其他简单管理控制 略。(懒得写了 ^_^)