1,程序集的种类
- 强命名程序集 使用了公钥进行签名 可以应用CLR的安全策略。---可以全局部署---可以部署到一些公认位置。
- 弱命名程序集 只能私有部署----部署到应用程序基目录或其子目录中
2,为程序集分配强名称
强命名程序集有4个重要特征---程序集显式名称
“MyTypes,Version=1.0.8123.0,Culture=neutral,publicKeyToken=b77a7c761934e089”
- 文件名:MyTypes.exe or MyTypes.dll
- 版本号
- 语言
- 公钥---标识技术
3,创建强程序集
- 使用 SN.EXE 创建 在目录下创建密钥文件:MyCompany.snk
- 可以将公钥文件输出到一个公钥文件中去
PS C:\reps\Clr VIA C#> SN -k MyCompany.snk
PS C:\reps\Clr VIA C#> SN -p MyCompany.snk MyCompany.PublicKey sha256 PS C:\reps\Clr VIA C#> SN -tp .\MyCompany.PublicKey Microsoft(R) .NET Framework 强名称实用工具 版本 4.0.30319.0 版权所有(C) Microsoft Corporation。保留所有权利。 公钥(哈希算法: sha256): 002400000c8000009400000006020000002400005253413100040000010001005d78d177c10143 8f68c31edc10f3f13d20a1065302831f606e5300913b234c246b41176ca426d2ca5e5f69dee43c 05d19d577a199868a82c0ab0da5c8900250e4d435d98a222d2a10db055eb526b7521ef4979d858 a616cb3565a12e7be7a4a4528af38267f9b0adc52bb91e43f09000d380ed07abea82d8c7e30dce 89ed46ab 公钥标记为 595a9e13589e00b9
3,创建程序集的几个办法----官网链接
csc /t:library UtilityLibrary.cs /keyfile:sgKey.snk
al /out:MyAssembly.dll MyModule.netmodule /keyfile:sgKey.snk
- 使用定制属性---要在同个目录
[assembly:AssemblyKeyFileAttribute("keyfile.snk")]
4,部署强命名程序集
gacutil.exe---使用详解---必须管理员模式打开VS,打开powshell。
进入到dll所在目录
gacutil.exe /i s7.net
然后在这个位置查看到其存在
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\S7.Net\v4.0_1.0.0.0__d5812d469e84c693
然后在注册表中注册
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\S7.NET
没有的项就新建
5,然后在引用的搜索里面就可以看到了
6,运行时如何解析引用类型:
使用ILDASM.EXE 并且在视图---查看字节----然后点击MAIN方法
.method private hidebysig static void Main(string[] args) cil managed // SIG: 00 01 01 1D 0E { .entrypoint // 方法在 RVA 0x2050 处开始 // 代码大小 17 (0x11) .maxstack 8 IL_0000: /* 72 | (70)000001 */ ldstr "hi" IL_0005: /* 28 | (0A)00000F */ call void [mscorlib]System.Console::WriteLine(string) IL_000a: /* 28 | (0A)000010 */ call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey() IL_000f: /* 26 | */ pop IL_0010: /* 2A | */ ret } // end of method Program::Main
使用视图----元信息----显示(^M)
TypeRef #17 (01000011) ------------------------------------------------------- Token: 0x01000011 ResolutionScope: 0x23000001 TypeRefName: System.Console MemberRef #1 (0a00000f) ------------------------------------------------------- Member: (0a00000f) WriteLine: CallCnvntn: [DEFAULT] ReturnType: Void 1 Arguments Argument #1: String MemberRef #2 (0a000010) ------------------------------------------------------- Member: (0a000010) ReadKey: CallCnvntn: [DEFAULT] ReturnType: ValueClass System.ConsoleKeyInfo No arguments.
7,管理控制
- 利用配置文件设定程序集
<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="AuxFiles"/> </assemblyBinding> </runtime> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/> </startup> </configuration>
略