ClickOnce 应用程序的强名称签名
强名称签名或强命名为软件组件提供他人无法伪造的全局唯一标识。 强名称用于保证组件依赖项和配置语句恰好映射到正确的组件和组件版本。
强名称是由程序集的标识(简单文本名称、版本号和区域性信息)加上公钥标记和数字签名组成的。
对于 Visual C# 和 Visual Basic 项目,Visual Studio 通过**“项目设计器”中的“签名”**窗格启用强命名;请参见“项目设计器”->“签名”页。
对于 Visual C++ 项目,使用链接器选项为程序集签名;请参见 强名称程序集(程序集签名)(C++/CLI)。
使用强命名的原因
强命名为某个应用程序或组件提供了唯一标识,其他软件可以使用该标识对相应的应用程序或组件进行显式引用。 例如,强命名使应用程序作者和管理员可以指定准确的用于共享组件的维护版本。 这使不同的应用程序可以指定不同的版本,而不会影响其他应用程序。 此外,还可以使用组件的强名称作为安全证据,以建立两个组件之间的信任关系。
可以强命名的内容
可以对 .NET Framework 程序集和 XML 清单进行强命名。 这些要求包括:
应用程序程序集 (.exe)
应用程序清单 (.exe.manifest)
部署清单 (.application)
共享组件程序集 (.dll)
应该强命名的内容
应对共享 DLL 进行强命名。 如果某个 DLL 不是应用程序的私有实现详细信息,而是可由多个应用程序使用的常规服务,则无论该 DLL 是否将要部署到全局程序集缓存,都建议使用强名称。
必须强命名的内容
必须对以下各项进行强命名:
希望部署到全局程序集缓存 (GAC) 的 DLL。
ClickOnce 应用程序和部署清单。 默认情况下,Visual Studio 项目系统为 ClickOnce 部署的应用程序启用此项。
用于 COM 互操作性的主互操作程序集。 当从 COM 类型库创建主互操作程序集时,TLBIMP 实用工具强制进行强命名。
不应该强命名的内容
通常应避免对应用程序 EXE 程序集进行强命名。 强命名的应用程序或组件不能引用弱命名的组件。 因此,对 EXE 进行强命名会阻止此 EXE 引用使用应用程序部署的弱命名的 DLL。
因此,Visual Studio 项目系统不对应用程序 EXE 进行强命名, 而是对在内部指向弱名称应用程序 EXE 的应用程序清单进行强命名。
此外,您可能还希望避免对应用程序的私有组件进行强命名。 因为在这种情况下,强命名会使依赖项更加难以管理,并为私有组件增加不必要的系统开销。
如何分配强名称
在 Visual Studio 中,使用**“项目设计器”的“签名”**窗格对应用程序或组件进行强命名。 **“签名”**窗格支持两个强命名方法:一个是使用强名称密钥文件;另一个是使用密钥提供程序。 有关清单签名的信息,请参见如何:对应用程序和部署清单进行签名;有关创建强名称密钥 (.snk) 文件的信息,请参见如何:创建公钥/私钥对。
使用密钥文件方法时,既可以使用现有密钥文件,也可以新建密钥文件。 应始终使用密码来保护密钥文件,以防止他人使用该文件。
密钥提供程序或证书存储区提供了另一种保证强名称密钥安全的方法。 某些密钥提供程序使用智能卡作为工具来验证标识并防止密钥被盗。
更新强名称组件
通过复制新版本覆盖旧版本的方式,无法对强名称组件进行维护或升级。
仅通过将新版本复制到应用程序目录中,就可以在应用程序目录中更新弱命名的 DLL。 公共语言运行时 (CLR) 将加载,无论版本是否实际存在。
对于强名称 DLL,必须重新编译整个应用程序或更新应用程序的 .config 文件,前一个操作可以使所有程序集引用都指向新版本,后一个操作可以指示运行时加载新版本而不加载旧版本。
尽管强名称组件需要更多一点的维护,但是它的好处在于应用程序对运行时所需要的其他组件的版本非常明确。