为什么要使用强命名程序集?


107

使用强命名程序集有什么优势?

普通装配不能完成哪些工作?

Answers:


92

让我首先列出强命名程序集的好处:

  1. 对程序集进行强命名可以使程序集包含在全局程序集缓存(GAC)中。因此,它允许您在多个应用程序之间共享它。

  2. 强大的命名保证了该程序集的唯一名称。因此,没有其他人可以使用相同的程序集名称。

  3. 强名保护程序集的版本沿袭。强大的名称可以确保没有人能够生成程序集的后续版本。确保应用程序用户所加载的程序集版本来自创建应用程序所用版本的同一发布者。

关于Microsoft的强命名的更多信息,请参见“ 强命名程序集MSDN)”。


1
您确定第4项吗?我认为也许这种行为最近有所改变。我试图通过修改它来使强命名程序集加载失败,但该加载过程没有发生任何事件。
延斯

19
关于#4这是不正确的。它并非旨在防止篡改。有关更多信息,请参见blogs.msdn.com/b/shawnfa/archive/2005/12/13/…
Colin Bowern 2013年

1
@ RobV8R我们90%的依赖项都是开源的,私钥位于公共git仓库中(根据Microsoft的建议),任何想要它们的人都可以使用。
流浪汉

1
@ RobV8R您不能在此处使用“妥协”一词,这意味着它原本打算成为秘密。Microsoft准则是私钥应保留在您的公共源存储库中。私钥不会受到损害,它们是有意公开的。假设私钥是已知的,并且打算供修改父项目的开源代码的人使用(否则在许多情况下会违反许可证),那么在此情况下,人们将使用不同的版本号但使用相同的密钥如果需要绑定重定向。
流浪汉

1
@ RobV8R我最初了解的是很多人认为强命名可以确保您的依赖项锁定到特定版本的程序集,而事实并非如此,简单的绑定重定向可以更改您使用的版本。使用相同的私钥签名。正如我已经说过的那样,私钥是针对我们大多数依赖项故意发布的。
流浪者

9

普通装配不能完成哪些工作?

由于从Nuget兴起开始的所有讨论都建议完全摆脱强命名程序集,因此我的公司尝试了这一点,并在应用程序设置方面遇到了行为上的重大变化:

如果您使用VisualStudio提供的自动应用程序或用户范围的应用程序设置(继承System.Configuration.ApplicationSettingsBase),则无论EXE文件位于何处,一个名为EXE的强健文件都会在%LOCALAPPDATA%中准确创建1个目录,例如“ YourApplication.exe_StrongName_kjsdfzsuzdfiuzgpoisdiufzsdouif”。位于。

但是没有强名,EXE的位置(= path)将用于创建在DEBUG和RELEASE构建之间已经不同的哈希值,从而在%LOCALAPPDATA%中创建许多名为“ YourApplication.exe_Url_dfg8778d6fs7g6d7f8g69sdf”的目录。这使得ClickOnce部署无法使用,因为安装目录随每次更新而更改。


5

我想补充一点,如果没有强名,则不能在配置文件中使用绑定重定向。

这将不起作用:

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="null" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>

您需要一个公共密钥令牌

  <dependentAssembly>
    <assemblyIdentity name="MyAssembly.MyComponent" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
  </dependentAssembly>

9
如果您不强名,则不需要绑定重定向。
蹦床

0

只是一个例子:我想给出一个答案,在安全方面做更多的强调。如果我们使用不希望被第三方重用但希望其可测试的源代码创建程序集,则可以强烈地对程序集进行签名,并使内部结构仅对具有相同的签名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.