clr via c# 程序集

1,程序集的种类

  • 强命名程序集 使用了公钥进行签名 可以应用CLR的安全策略。---可以全局部署---可以部署到一些公认位置。
  • 弱命名程序集 只能私有部署----部署到应用程序基目录或其子目录中

2,为程序集分配强名称

   强命名程序集有4个重要特征---程序集显式名称

    “MyTypes,Version=1.0.8123.0,Culture=neutral,publicKeyToken=b77a7c761934e089”

  • 文件名:MyTypes.exe or MyTypes.dll
  • 版本号
  • 语言
  • 公钥---标识技术

3,创建强程序集

  1. 使用 SN.EXE 创建 在目录下创建密钥文件:MyCompany.snk
  2. PS C:
    epsClr VIA C#> SN -k MyCompany.snk
  3. 可以将公钥文件输出到一个公钥文件中去
  4. PS C:
    epsClr VIA C#> SN -p MyCompany.snk MyCompany.PublicKey sha256
    PS C:
    epsClr 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,创建程序集的几个办法----官网链接

  •         在VS的属性中的签名
  • image
  • 使用CSC编译器
  • csc /t:library UtilityLibrary.cs /keyfile:sgKey.snk
  • 使用AL链接器
    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:WindowsMicrosoft.NETassemblyGAC_MSILS7.Netv4.0_1.0.0.0__d5812d469e84c693

然后在注册表中注册

计算机HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFrameworkv4.0.30319AssemblyFoldersExS7.NET

image

没有的项就新建

5,然后在引用的搜索里面就可以看到了

image

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>
  • 发布者策略控制

  略

原文地址:https://www.cnblogs.com/frogkiller/p/12241387.html