博客园对markdown支持不佳,错乱移步Github IO 博文
模块/程序集
程序集是一个或多个模块/资源 文件的逻辑分组。程序集是重用、安全性、以及版本控制的最小单元。一般认为一个dll/exe是一个程序集,但是还可以生成多文件程序集,使用AL.exe
如何判断是否安装了.NET Framework,只需检查%SystemRoot%/System32/MSCorEE.dll
文件即可如图,文件说明写出是 .NET Runtime Execution Engine
当一个方法第一次执行时,CLR内部的某个表会为该方法所在类型的所有方法创建一个记录项,对应着一个地址,在JIT编译IL => Native code时查找IL代码,JIT编译好的Native Code存放在内存中,并更新表中的地址,也就是下一次调用该方法时,直接执行的是Native Code,不用再次经过JIT了。这个不用是在一个程序的执行时间内,要是将程序关闭了,再打开还得重来。.NET都是半解释性性语言。
CTS : 通用类型系统CLS : 通用语言规范由于各个语言实现的不尽一致,MS定义了一个公共语言规范(Common Language Specification)
,它详细定义了一个最小功能集.例如使用[assembly:CLSCompliant(tue)]
指定此程序集是CLS兼容的
public UInt32 Abc()public int Xyz()public int xyz()
以上会得到警告,因为有的语言没有unsigned int,而Xyz和xyz方法,是依靠大小写来区分的,像VB 就不能区分这两个方法.
在CLS中,类型的成员要么是一个字段
,要么是一个方法
,像是C#提供的属性(PRoperty),事件(event)/委托(delegate)/运算符重载 都是C#编译器提供的,到IL层,只有字段和方法.delegate会变成一个类,这个另说.
class Hello{public static void Main(){System.Console.WriteLine("Hello World ...");}}
csc /out:hello.exe /target:exe hello.cs
/target 或者 /t 表示输出类型
/addmodule:
添加module引用/reference: 或 /r 表示添加引用
csc hello.cs
会生成hello.exe/out:hello.exe 和 /t:exe 是默认的
CSC编译时默认引用MSCorLib.dll,可以指定/nostdlib
使程序不默认引用这个
在CSC编译的时候,/r /t /out 命令可以保存在一个文件了,如MyProj.rsp
csc @MyProj.rsp hello.cs
还会在CSC.exe 相同目录中查找一个全局的CSC.rsp
文件,例如我的电脑上是C:/Windows/Microsoft.NET/Framework/v4.0.30319/csc.rsp
里面Reference了一堆基本的dll,使用/noconfig
指定编译时忽略这个全局响应文件
hello.cs
class Hello{public static void Main(){System.Console.WriteLine("Hello World ...");Method.AStaticMethod();}}
method.cs
public class Method{public static void AStaticMethod(){System.Console.WriteLine("Hello from another module ...");}}
执行
csc /t:module method.cscsc /addmodule:method.netmodule hello.cshello
结果生成的netmodule文件是一个不包含清单元数据表的PE文件,添加到一个程序集后,这个netmodule不能删除,删除会抛出FileNotFoundException
未经处理的异常: System.IO.FileNotFoundException: 未能加载文件或程序集“method.netmodule”或它的某一个依赖项。系统找不到指定的文件。 ---> System.IO.FileNotFoundException: 系统找不到指定的文件。 (异常来自 HRESULT:0x80070002) --- 内部异常堆栈跟踪的结尾 --- 在 Hello.Main()
al.exe /t:library /out:example.dll a.netmodule b.netmodule
使用/link[resource]连接资源/resource 嵌入资源
探测目录
privatePath在app.config中配置
<configuration> <runtime> <assemblyBinding> <probing privatePath="Private"...
sn -k magicdawn.snk //创建一个snk,包含私钥公钥csc /keyfile:magicdawn.snk hello.cs
或者
sn -p magicdawn.snk magicdawn.PublicKey //创建两个,publickey只包含公钥sn -tp magicdawn.PublicKey //查看公钥
新闻热点
疑难解答