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我不太明白微软如此设计具有怎样的考虑,但是对于我们目前的项目来说,我是无法接受的。上面的例子中只有两个需要签名的项目,就需要维护两个Key File,但是我们的项目中有数十个项目,就意味着需要维护数十个不同的Key File,从维护的角度讲,如果有朝一日我需要更换另一个Key File, 我就需要为每个项目进行更新。 那么我们有没有办法让所有项目采用同一个Key File进行签名呢?当然有,不然我也不会写这篇文章了。总的来说,我们三种不同的解决方案。 解决方案1:通过AssemblyKeyFileAttribute特性指定Key FileAssemblyKeyFileAttribute特性定义在System.Reflection命名空间下,专门用于指定在对项目进行强签名时采用的Key File。所以我们只需要在AssemblyInfo.cs中(也可以在其它地方)指定我们采用的Key File文件路径即可。通过下面的代码,我们指定我们对Lib1项目指定了我真正期望用于进行签名的那个Key File。 1: [assembly: AssemblyVersion("1.0.0.0")] 3: [assembly: AssemblyKeyFile("..Key.snk")]
解决方案2:通过命令行进行强签名相信大家对通过命令行对程序集进行强签名的方式都不会感到陌生。这种方式就是直接使用.NET Framework为我们提供的强名称工具(SN.exe: Strong Name Tool)。关于SN.exe相关参数设定可以参考MSDN在线文档(http://msdn.microsoft.com/en-us/library/k5b5tt23(VS.80).aspx),在这里就不再赘言介绍了。 解决方案3:以Link的方式添加Key File 这是我最初想到的办法,但是当我试验的时候将Key File添加到项目文件的Properties子目录下,导致它重新创建新的File File。但是有人评论说这个方式是可行的,所有我尝试了一下,只要将Key File以Link的方式添加到项目的根目录下就可以了。 解决方案4:还是通过项目设置(Project Setting) 还是使用文章刚开始的那种方式,直接设置项目关于签名(Signing)的相关属性。有人会说了,你不是说这种方式会导致Key File的复制吗,为何还要使用这种方式。为此,我们需要换一种思维:通过项目设置对象框对项目进行的所有设置最终都会反映在项目文件中(.csproj或者.vbproj)。虽然通过Visual Studio不能实现我们的目标,如果我们直接更新项目文件呢?实践证明,这种方案时可行的。为此,我们通过NotePad打开Lib1的项目文件Lib1.csproj,在<ProjectGroup>元素中加上一个<AssemblyOriginatorKeyFile>元素,并指定Key File的路径(..Key.snk)即可。 2: <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 4: <PropertyGroup> 6: </PropertyGroup> 8: <AssemblyOriginatorKeyFile>..Key.snk</AssemblyOriginatorKeyFile> 10: </Project>
作者:Artech
出处:http://artech.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 比较Razor vs ASPX语法
- asp.net mvc 2.0 Jquery表单提交
- ASP.NET -- WebForm -- .aspx与.aspx.cs文件
- asp.net – Web窗体用户控件加载时的空字段
- asp.net-mvc – 你如何覆盖Html.ActionLink?
- asp.net-mvc – MVC可选参数默认值
- asp.net-mvc – 我应该每个请求使用一个HttpClient实例来处
- asp.net-core – 将参数传递给ASP.NET MVC 6中的需求/策略
- asp.net-mvc – ASP.NET MVC UpdateModel容易受到黑客攻击?
- 一句代码实现批量数据绑定[上篇]