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

简介:   由于我们的项目底层使用到一个通过LogicalCallContext实现的上下文数据管理框架,导致所有的Unit Test不能正常运行。具体的现象在《只在UnitTest和WebHost中的出现的关于LogicalCallContext的严重问题》有过详细的介绍。

  由于我们的项目底层使用到一个通过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 >

 

 

目录
相关文章
|
27天前
|
人工智能 开发框架 C#
C#/.NET/.NET Core技术前沿周刊 | 第 6 期(2024年9.16-9.22)
C#/.NET/.NET Core技术前沿周刊 | 第 6 期(2024年9.16-9.22)
|
26天前
|
人工智能 开发框架 Cloud Native
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
C#/.NET/.NET Core技术前沿周刊 | 第 9 期(2024年10.07-10.13)
|
30天前
|
编解码 数据安全/隐私保护
.Net PdfiumViewer 打印时无法渲染电子签名问题的解决方法
【10月更文挑战第14天】这段内容介绍了使用 PdfiumViewer 库处理 PDF 文件时遇到电子签名无法打印的问题及其解决方法。首先分析了 PdfiumViewer 默认设置或对电子签名支持不足可能导致此问题,建议更新库版本并通过 NuGet 包管理器进行升级。接着检查打印机设置和驱动程序,确保设置正确且驱动为最新版本。然后优化自定义打印代码,提高渲染分辨率,确保电子签名正确加载。最后,验证 PDF 文件格式和兼容性,必要时联系技术支持或求助技术社区。
|
26天前
|
数据可视化 NoSQL C#
C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)
C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)
|
27天前
|
设计模式 开发框架 C#
C#/.NET/.NET Core技术前沿周刊 | 第 4 期(2024年9.1-9.8)
C#/.NET/.NET Core技术前沿周刊 | 第 4 期(2024年9.1-9.8)
|
1月前
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
47 0
|
2月前
|
人工智能 前端开发 开发工具
解读.NET 技术的开发潜力
本文全面介绍了.NET技术在软件开发领域的核心优势、创新应用及面临的挑战。.NET以其统一的开发平台、强大的工具和跨平台能力,成为企业级应用、Web应用乃至游戏开发的理想选择。然而,在性能优化、容器化及AI集成等方面仍需不断突破。通过积极拥抱开源和社区驱动模式,.NET将持续推动软件开发的进步。
54 1
|
2月前
|
人工智能 前端开发 Devops
.NET技术自发布以来,在软件开发领域发挥了重要作用
【9月更文挑战第12天】.NET技术自发布以来,在软件开发领域发挥了重要作用。本文分为三部分探讨其在现代开发中的应用:首先介绍.NET的核心价值,包括语言多样性、强大的开发工具支持、丰富的类库、跨平台能力和活跃的社区;接着分析其在企业级应用、Web开发、移动应用、云服务及游戏开发中的实际应用;最后讨论.NET面临的挑战与未来趋势,如性能优化、容器化、AI集成及跨平台框架竞争等。通过不断的技术创新和社区驱动,.NET将持续推动软件开发的进步。
38 4
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
38 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
53 0

热门文章

最新文章