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:\reps\Clr VIA C#> SN -k MyCompany.snk
  3. 可以将公钥文件输出到一个公钥文件中去
  4. 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,创建程序集的几个办法----官网链接

  •         在VS的属性中的签名
  • clr via c# 程序集
  • 使用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:\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

        clr via c# 程序集

        没有的项就新建

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

        clr via c# 程序集

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

          上一篇:到底什么是NET?


          下一篇:IronPython和提前编译