为什么使用强名称程序集?

时间:2010-03-01 05:58:36

标签: c# .net

使用强名称程序集有什么好处?

普通装配无法做到的事情是什么?

4 个答案:

答案 0 :(得分:87)

让我列出强烈命名装配的好处:

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

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

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

  4. 强命名程序集使用数字签名进行签名。这可以保护组件免受修改。任何篡改都会导致在装配加载时发生的验证过程失败。生成异常并且未加载程序集。

  5. 有关Microsoft强有力命名的更多信息,请参阅 Strong-Named Assemblies MSDN)。

答案 1 :(得分:7)

  

普通装配无法做到的事情是什么?

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

如果您使用VisualStudio提供的自动应用程序或用户范围应用程序设置(继承System.Configuration.ApplicationSettingsBase),那么强大的名为EXE的内容将在%LOCALAPPDATA%内创建一个名为“YourApplication.exe_StrongName_kjsdfzsuzdfiuzgpoisdiufzsdouif”的目录,无论在哪里EXE位于。

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

答案 2 :(得分:3)

我想补充说,如果没有强名称,您就无法在配置文件中使用绑定重定向。

这不起作用:

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

答案 3 :(得分:0)

举个例子:我想在security中给予答案更多的重点。在我们使用源代码创建程序集的情况下,我们不希望将其重新用于第三方,但我们希望它是可测试的,我们可以强烈签署程序集并使内部构件仅对这些程序集可见具有相同的签名。