为什么使用强名字集合?

使用强命名的程序集的优点是什么?

常规assembly不能完成的事情是什么?

让我先列举强大的命名组合的好处:

  1. 强大的命名您的程序集允许您将程序集包含到全局程序集caching (GAC)中。 因此,它允许您在多个应用程序之间共享它。

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

  3. 强名称保护程序集的版本血统。 一个强大的名字可以确保没有人能够产生你的程序集的后续版本。 确保应用程序用户正在加载的程序集版本来自创build应用程序所用版本的相同发布者。

  4. 使用数字签名来签名强有力的程序集。 这可以防止修改组件。 任何篡改都会导致在assembly加载时发生的validation过程失败。 生成一个exception,程序集未加载。

更多关于来自微软的强大命名是强命名组件 ( MSDN )。

常规assembly不能完成的事情是什么?

由于所有与Nuget崛起开始的讨论build议彻底摆脱强有力的命名集会,我的公司尝试了这一点,并遇到了应用程序设置的行为的重大变化:

如果使用由VisualStudio提供的自动应用程序或用户范围的应用程序设置(inheritanceSystem.Configuration.ApplicationSettingsBase),那么强名称EXE将在%LOCALAPPDATA%内创build一个名为例如“YourApplication.exe_StrongName_kjsdfzsuzdfiuzgpoisdiufzsdouif”的目录,无论EXE位于何处位于。

但是如果没有强名称,EXE的位置(=path)将用于创build一个已经在DEBUG和RELEASE构build之间不同的散列值,在%LOCALAPPDATA%内创build许多名为“YourApplication.exe_Url_dfg8778d6fs7g6d7f8g69sdf”的目录。 这使得安装目录随每次更新而变化的ClickOnce部署无法使用。

我想补充说,没有一个强大的名字,你不能在configuration文件中使用绑定redirect。

这不会工作:

<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> 

只是一个例子:我想给出一个答案,在安全上更加重视。 在这种情况下,我们创build了一个源代码的程序集,我们不想为第三方重用,但我们希望它是可testing的,我们可以强烈地签署一个程序集,并使内部仅对那些具有相同的签名。