一起谈.NET技术,Visual Studio对程序集签名时一个很不好用的地方

  由于我们的项目底层使用到一个通过LogicalCallContext实现的上下文数据管理框架,导致所有的Unit Test不能正常运行。具体的现象在《只在UnitTest和WebHost中的出现的关于LogicalCallContext的严重问题》有过详细的介绍。解决的方案就是对相关的程序集进行强签名,并加到GAC中,是Unit Test能够识别基于    LogicalCallContext项目的类型。有了Visual Studio这个强大的IDE,程序集的签名工作很好实现——仅仅需要在Project的Properties对象框的Signing Tab中指定一个Key File就可以了。但是,Visual Studio做得不够好。

  一、Visual Studio会自作主张地在项目根目录下复制一个Key File 

  举个例子,假设一个解决方案中具有两个项目:Lib1和Lib2。现在我们需要使用“同一个Key File”对Lib1和Lib2进行签名,Lib1、Lib2和Key File(Key.snk) 对应的目录结构如右图所示:Key.snk和Lib1和Lib2处在相同的目录下面。

 

  现在我们右击Lib1项目文件,选择Properties菜单项进行项目属性对话框,选择Signing Tab页进行程序集签名相关设置。选中Sign the assembly复选框,在下拉框中选择<Browse>选项,并在弹出的文件选择对话框中我们的Key File:Key.snk。

 

 

  但是当你选中Key.snk这个文件的时候,Visual Studio并不会用将这个文件作为对本程序集进行签名的Key File,而是会自作主张地将该文件拷贝到Lib1所在的根目录下。最终被用于程序集签名的不是我们希望的那个File Key,而是该File Key的复制品(如下图所示)。

  我不太明白微软如此设计具有怎样的考虑,但是对于我们目前的项目来说,我是无法接受的。上面的例子中只有两个需要签名的项目,就需要维护两个Key File,但是我们的项目中有数十个项目,就意味着需要维护数十个不同的Key File,从维护的角度讲,如果有朝一日我需要更换另一个Key File, 我就需要为每个项目进行更新。

  那么我们有没有办法让所有项目采用同一个Key File进行签名呢?当然有,不然我也不会写这篇文章了。总的来说,我们三种不同的解决方案。

解决方案1:通过AssemblyKeyFileAttribute特性指定Key File

  AssemblyKeyFileAttribute特性定义在System.Reflection命名空间下,专门用于指定在对项目进行强签名时采用的Key File。所以我们只需要在AssemblyInfo.cs中(也可以在其它地方)指定我们采用的Key File文件路径即可。通过下面的代码,我们指定我们对Lib1项目指定了我真正期望用于进行签名的那个Key File。

   1: [assembly: AssemblyVersion("1.0.0.0")]
   2: [assembly: AssemblyFileVersion("1.0.0.0")]
   3: [assembly: AssemblyKeyFile("..\\Key.snk")]

  但是,这并不是一种推荐的Key File指定方式。当你添加了AssemblyKeyFileAttribute特性的时候,Visual Studio会有如下一个警告:“Use command line option '/keyfile' or appropriate project settings instead of 'AssemblyKeyFile'”。提示你采用另外两种方案:命令行或者项目设置。

  解决方案2:通过命令行进行强签名

  相信大家对通过命令行对程序集进行强签名的方式都不会感到陌生。这种方式就是直接使用.NET Framework为我们提供的强名称工具(SN.exe: Strong Name Tool)。关于SN.exe相关参数设定可以参考MSDN在线文档(http://msdn.microsoft.com/en-us/library/k5b5tt23(VS.80).aspx),在这里就不再赘言介绍了。

  解决方案3:还是通过项目设置(Project Setting)

  还是使用文章刚开始的那种方式,直接设置项目关于签名(Signing)的相关属性。有人会说了,你不是说这种方式会导致Key File的复制吗,为何还要使用这种方式。为此,我们需要换一种思维:通过项目设置对象框对项目进行的所有设置最终都会反映在项目文件中(.csproj或者.vbproj)。虽然通过Visual Studio不能实现我们的目标,如果我们直接更新项目文件呢?实践证明,这种方案时可行的。为此,我们通过NotePad打开Lib1的项目文件Lib1.csproj,在<ProjectGroup>元素中加上一个<AssemblyOriginatorKeyFile>元素,并指定Key File的路径(..\Key.snk)即可。


<?xml version="1.0" encoding="utf-8"?>

<Project ToolsVersion="4.0" DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
......
<PropertyGroup>
<SignAssembly>true</SignAssembly>
</PropertyGroup>
<PropertyGroup>
<AssemblyOriginatorKeyFile>..\Key.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>
</Project>

 

 

时间: 2024-11-10 05:24:16

一起谈.NET技术,Visual Studio对程序集签名时一个很不好用的地方的相关文章

Visual Studio对程序集签名时一个很不好用的地方

由于我们的项目底层使用到一个通过LogicalCallContext实现的上下文数据管理框架,导致所有的Unit Test不能正常运行.具体的现象在<只在UnitTest和WebHost中的出现的关于LogicalCallContext的严重问题>有过详细的介绍.解决的方案就是对相关的程序集进行强签名,并加到GAC中,是Unit Test能够识别基于LogicalCallContext项目的类型.有了Visual Studio这个强大的IDE,程序集的签名工作很好实现--仅仅需要在Projec

一起谈.NET技术,使用VS2010为Windows7编写一个杀手级WPF应用

当你使用最新的操作系统,在最新的框架上构建应用程序,并且使用最新版本的Visual Studio的时候,你可以使用许多令人兴奋的新特性.你可以学习一下怎样使用Visual Studio 2010, WPF 4 和 the Windows API Code Pack给你的应用程序添加Windows 7 UI. Windows 7 UI有很多令人兴奋的元素,例如:全新的任务栏,或者跳转列表,视觉体验本身并不属于应用程序的范畴,但是它是应用程序体验的重要组成部分.作为一个WPF开发者,你可以把那些元素

Visual Studio编译WebSite项目时出现的问题

如何解决Visual Studio编译WebSite项目时的cannot update project reference问题 问题出现的场景: 1. Visual Studio 的版本:Visual Studio 2012 2. Web 项目类型是 WebSite,不是 Web Application 3. Web 项目引用的 Visual Studio 项目被删除或卸载(Unload) 详细的错误信息: Error 124 Cannot update project reference ''

初学者 用visual studio中的C#编写一个简单的电子词典 在线等 求帮助

问题描述 初学者 用visual studio中的C#编写一个简单的电子词典 在线等 求帮助 求大神用visual studio2010帮忙编一个简单电子词典的程序,在线等 新人初学者求帮助 解决方案 很简单啊,写个数组就行了 解决方案二: 如果是像上面这样的电子词典,很容易解决.1.使用INI进行保存条目.(想要了解INI可以参考:http://www.cnblogs.com/Ray-chen/archive/2011/11/14/2248496.html)2.使用StreamWriter来读

调试-cocos2d-x在visual studio中运行cpp-tests时为什么总是无法运行成功?

问题描述 cocos2d-x在visual studio中运行cpp-tests时为什么总是无法运行成功? 如题,在运行调试的时候会弹出有些项目已经过期的窗口,继续运行的话生成失败 解决方案 项目过期是因为你更改了源代码,但是没有成功编译. 没有成功编译的问题是你没有配置好环境(假设代码没问题的话) 参考:http://blog.csdn.net/shuideyidi/article/details/38435165 配置你的环境. 解决方案二: 一般是代码文件等修改时间有变化,也就是文件变化了

一起谈.NET技术,Visual Studio DSL 入门 3---创建一个简单的DSL模型

     从这节开始我们就开始我们的DSL之旅, 首先确保你已经安装了Visual Studio Sdk,并且使用的是Visual Studio 2008.我们先大概创建一个简单的DSL项目,通过这个项目来了解dsl的开发环境和流程. 1. 打开VS.NET ,新建--项目, 点击其它项目类型--扩展性(Extensibility). 这里列出来了vs.net扩展类型的项目,包括Addin,VSPackage,Dsl等项目类型,选择"Domain Specific Lan  guage Desi

Visual Studio DSL 入门 3---创建一个简单的DSL模型

从这节开始我们就开始我们的DSL之旅, 首先确保你已经安装了Visual Studio Sdk,并且使用的是Visual Studio 2008.我们先大概创建一个简单的DSL项目,通过这个项目来了解dsl的开发环境和流程. 1. 打开VS.NET ,新建--项目, 点击其它项目类型--扩展性(Extensibility). 这里列出来了vs.net扩展类型的项目,包括Addin,VSPackage,Dsl等项目类型,选择"Domain Specific Lan  guage Designer&

visual studio 2010-关于VS的一个小测试程序问题,函数调用顺序

问题描述 关于VS的一个小测试程序问题,函数调用顺序 新手学C++,把C++ primer 上的两个例子用Visual Studio 2010弄到一起的时候出现了一个问题. 一共用了三个函数放在三个cpp文件,被调用的两个均用头文件进行了声明. 两个函数实现的功能很简单分别是:1.多个数相加求和(plus()) 2.输入两个数字作为上界和下界并求和.(two_num()) 问题出现在:在main函数下进行调用的时候, 先调用two_num();再调用plus()可以正常执行. #include

一起谈.NET技术,打包Asp.Net 网站成为一个exe方便快捷的进行客户演示

在Asp时代有一个NetBox 产品可以把整个Asp网站AllInOne的打包成一个exe,在没有IIS的情况下可以单独运行这个exe来开启整个网站.在Asp.Net 下一直没有类似的产品出现,可能是IIS已经非常的强大了,不需要类似的产品了? 但是在某种场景下还是需要一个类似功能的产品的,这个产品不是用来部分替代IIS来做一个轻量级的IIS,而是用来方便快捷的进行客户展示. 例如,当完成一个网站开发后,或者部分完成开发后,想给客户展示一下,收集一下客户的反馈,一般有两种做法: 1. 自己有主机