现在的位置: 首页 > 综合 > 正文

具有强名称的程序集

2014年02月27日 ⁄ 综合 ⁄ 共 2548字 ⁄ 字号 评论关闭

      强名称是由程序集的标识加上公钥和数字签名组成的。其中,程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。强名称是使用相应的私钥,通过程序集文件(包含程序集清单的文件,并因而也包含构成该程序集的所有文件的名称和散列)生成的。Microsoft® Visual Studio® .NET 和在 .NET Framework SDK 中提供的其他开发工具能够将强名称分配给一个程序集。强名称相同的程序集应该是相同的。

通过签发具有强名称的程序集,您可以确保名称的全局唯一性。强名称还特别满足以下要求:

  • 强名称依赖于唯一的密钥对来确保名称的唯一性。任何人都不会生成与您生成的相同的程序集名称,因为用一个私钥生成的程序集的名称与用其他私钥生成的程序集的名称不相同。

  • 强名称保护程序集的版本沿袭。强名称可以确保没有人能够生成您的程序集的后续版本。用户可以确信,他们所加载的程序集的版本出自创建该版本(应用程序是用该版本生成的)的同一个发行者。

  • 强名称提供可靠的完整性检查。通过 .NET Framework 安全检查后,即可确信程序集的内容在生成后未被更改过。但请注意,强名称中或强名称本身并不暗含信任级别,例如由数字签名和支持证书提供的信任。

在引用具有强名称的程序集时,您应该能够从中受益,例如版本控制和命名保护。如果此具有强名称的程序集以后引用了具有简单名称的程序集(后者没有这些好处),则您将失去使用具有强名称的程序集所带来的好处,并依旧会产生 DLL 冲突。因此,具有强名称的程序集只能引用其他具有强名称的程序集。

使用程序集和全局程序集缓存  

 

如果您需要在几个应用程序间共享程序集,可将其安装到全局程序集缓存中。安装了公共语言运行库的每台计算机均具有此计算机范围的代码缓存。全局程序集缓存中存储了专门指定给由计算机中若干应用程序共享的程序集。要安装到全局程序集缓存中,程序集必须具有强名称。

Note注意

全局程序集缓存中放置的程序集必须具有相同的程序集名称和文件名(不包括文件扩展名)。例如,程序集名称为 myAssembly 的程序集必须具有名为 myAssembly.exe 或 myAssembly.dll 的文件。

应当只在必要时才将程序集安装到全局程序集缓存中来共享程序集。一般原则是:程序集依赖项保持专用,并在应用程序目录中定位程序集,除非明确要求共享程序集。另外,您不必为了使 COM interop 或非托管代码可以访问程序集而将程序集安装到全局程序集缓存。

要将程序集安装到全局程序集缓存中的原因有以下几点:

  • 共享位置。

    可将应用程序应该使用的程序集放在全局程序集缓存中。例如,如果所有的应用程序都应使用位于全局程序集缓存中的程序集,则可将版本策略语句添加到 Machine.config 文件(此文件将引用重新定向到程序集)。

  • 文件安全性。

    管理员通常使用访问控制列表 (ACL) 来保护 systemroot 目录,以控制写入和执行访问。因为全局程序集缓存安装在 systemroot 目录中,它继承了该目录的 ACL。建议只允许具有“管理员”权限的用户从全局程序集缓存中删除文件。

  • 并行版本控制。

    可在全局程序集缓存中维护程序集的多个副本(名称相同但版本信息不同)。

  • 其他搜索位置。

    在探测或使用配置文件中的基本代码信息之前,公共语言运行库会先检查全局程序集缓存中符合程序集请求的程序集。

请注意,在有些情况下,您肯定不需要将程序集安装到全局程序集缓存中。如果将组成应用程序的某个程序集放在全局程序集缓存中,就无法再通过使用 XCOPY 复制应用程序目录来复制或安装应用程序。在这种情况下,还必须将程序集移到全局程序集缓存中。

全局程序集缓存

要使用 Visual Studio .NET 创建小型类库项目、生成强名称,以及在 GAC 中安装项目的 .dll 文件,请按照下列步骤操作:

1. 在 Visual Studio .NET 中,创建一个新 Visual C# .NET 类库项目,并将该项目命名为 GACDemo
2. 必须使用强名称。要生成此加密密钥对,请使用 SN 工具。此工具位于安装 .NET Framework 解决方案开发人员工具包 (SDK) 的 /bin 子目录中。SN 工具易于使用。命令行语句采用以下形式:

sn -k "[DriveLetter]:/[DirectoryToPlaceKey]/[KeyName].snk"
3. 在 C:/ 中创建一个名为 GACKey 的目录,以便您可以轻松地找到密钥,并从命令提示符处访问该密钥。

注意:对于大多数用户,.NET 工具位于 C:/Program Files/Microsoft.NET/FrameworkSDK/Bin 中。键入以下 SN 命令前,可能需要在您的计算机上将与该路径类似的路径复制到 .NET bin 目录中。从命令提示符处键入 cd,右键单击以粘贴该路径,然后按 Enter,快速转至 SN 工具所在的目录。

键入以下内容:

sn -k "C:/GACKey/GACkey.snk"
4. 将生成一个密钥,但是它与项目的程序集尚无关联。要建立此关联,请在 Visual Studio .NET 解决方案资源管理器中双击 AssemblyInfo.cs 文件。此文件具有一个程序集属性列表,默认情况下,在 Visual Studio .NET 中创建项目时将包括这些属性。在代码中修改“AssemblyKeyFile”程序集属性,如下所示:

[assembly:AssemblyKeyFile("C://GACKey//GACKey.snk")]

通过按 Ctrl+Shift+B 来编译项目。您不必具有任何附加代码即可以在 GAC 中安装 .dll 文件。

5. 您可以通过使用 Gacutil 工具或者通过将 .dll 文件拖至适当的目录来安装 .dll 文件。如果您使用 Gacutil 工具,则可以使用以下命令:

gacutil -I "[DriveLetter]:/[PathToBinDirectoryInVSProject]/gac.dll"

如果您要拖动文件,请使用 Microsoft Windows 资源管理器。打开 Windows 资源管理器的两个实例。在一个实例中,找到控制台项目的 .dll 文件输出的位置。在另一实例中,找到 c:/[SystemRoot]/Assembly。

将您的 .dll 文件拖到“Assembly”文件夹中。

抱歉!评论已关闭.