一起谈.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)即可。
<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>
转载于:https://www.cnblogs.com/waw/archive/2011/09/01/2162672.html
一起谈.NET技术,Visual Studio对程序集签名时一个很不好用的地方相关推荐
- 使用 Visual Studio Code 和 Pandoc 构建一个惊人的 Markdown 编辑器
使用 Visual Studio Code 和 Pandoc 构建一个惊人的 Markdown 编辑器 1. 安装 Visual Studio Code 2. 熟悉 VS Code 开箱即用的 Mar ...
- Visual Studio Code设置断点时出现Unverified breakpoint该咋办
有的时候在Visual Studio Code里选中某一行设置断点,发现代码行号前面的圆圈是空心的, 而期望的断点设置成功后,显示是这样的: 空心的圆圈前面弹出的提示"Unverified ...
- Visual Studio 2017中的第一个Python项目
目录 介绍 背景 实现 结论 介绍 Python正在成为一种流行的编程语言,每个人都想开始使用Python.但是我们已经看到,大多数开发人员对于从哪里开始以及如何创建他们的第一个python应用程序感 ...
- Visual Studio 2017在编译时出现错误E2512:功能测试宏的参数必须是简单标识符
Visual Studio 2017在编译时出现错误E2512:功能测试宏的参数必须是简单标识符 问题描述: Visual Studio 2017在编译时出现错误E2512:功能测试宏的参数必须是简单 ...
- vs2017c语言一闪而逝6,Visual Studio IDE编写程序时不显示窗口或窗口一闪而逝的解决方法...
这篇文章主要为大家详细介绍了Visual Studio IDE编写程序时不显示窗口或窗口一闪而逝的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 使用Visual Studio IDE编写 ...
- 使用Visual Studio Code 运行编写第一个html文件
Visual Studio Code 下载地址 安装完成后 需要安装一个插件工具 open in browser 可以让该软件中使代码运行显示在浏览器上 编写第一个网页 需要先ctrl+s 保存为后缀 ...
- 【转】带你玩转Visual Studio——02.带你新建一个工程
接着上一篇文章带你玩转Visual Studio--开篇介绍继续讲这个主题,现在我们从创建一个新的工程开始. 一步一步创建项目 依次选择菜单:File\New\Project,打开New Projec ...
- Visual Studio二次安装时无法更改安装位置解决方案
背景:去年年底因为一个C#项目,安装过Visual Studio,当时采用的是默认安装,即安装到C盘.最近有个VB的桌面小项目,想安装Windows开发平台负载时发现C盘剩余空间不足15G,随起了卸载 ...
- 在Chrome+Visual Studio中调试asp.net程序很慢的问题(Firefox也有类似问题)
今天开始起在Chrome中调试,发现问题主要出在菜单栏(layout文件)中,google了一番,查到很多原因,不过最终解决方法倒是很简单,特此分享一下: 在C:/Windows/System32/d ...
最新文章
- POJ 3264 Balanced Lineup
- Operating System Concepts--chap9 Memory Management;
- Android之Service与IntentService的比较
- MySQL复制常用拓扑结构详解
- 【移植驱动到Linux3.4.2内核之二】LCD,触摸屏,按键,USB等驱动程序的移植心得总结
- ModuleNotFoundError: No module named ‘torch.utils.serialization‘解决
- .NET 的 WCF 和 WebService 有什么区别?(转载)
- button的onclick函数一直刷新
- 国内互联网企业奇妙招数
- 微信公号“架构师之路”学习笔记(六)-互联网一致性架构设计(session一致性,主从一致性,双主一致性,缓存一致性,冗余一致性,消息时序一致性,分布式事务一致性,数据扣减一致性等)
- 数字孪生智慧运维系统方案
- jsp——SmartUpload上传下载
- sop流程图模板_标准作业流程SOP详解,附流程图绘制规范,不愁不会画!
- python合并excel工作簿_使用python将excel工作簿工作表合并为一个工作表
- 初赛模拟试题错题锦集
- python-货币转换
- 行列式公式和代数余子式
- 光敏电阻简单应用——晚上灯亮,白天灯灭
- windows批处理脚本bat命令解析【7】EXIT /B 0
- 策略模式代替if-else
热门文章
- AndroidStudio_使用NanoHTTPD搭建HTTP服务_把android设置当成一个http服务器来使用---Android原生开发工作笔记225
- Netty工作笔记0014---Buffer类型化和只读
- STM32工作笔记0061---通用定时器基本原理
- C语言和设计模式(观察者模式)
- html 折叠焦点图切换,jQuery层叠式图片切换焦点图插件
- ssh mysql 命令_ssh mysql命令大全
- android8.0电脑壁纸,Android用原生分享多张图片适配7.0、8.0
- angular语言前端开发_2020年前端Angular招聘-前端Angular招聘求职信息-拉勾招聘
- 堡垒之夜安装包删除_堡垒之夜安装不了怎么办_常见安装下载问题解决方法_3DM网游...
- 组装复杂json请求数据和解析复杂json数据