从编译DotNetOpenAuth中学到的程序集强签名知识

OAuth的一个.NET开源实现,官方网站:http://dotnetopenauth.net/ 。

GitHub签出DotNetOpenAuth的源代码发现最新版本已到5.1,而NuGet中发布的版本只是4.3。新版中使用到了.NET 4.5的异步特性(async, await),于是决定直接用最新版。

用最新版,就要自己进行编译。用Visual Studio 2012打开解决方案文件进行编译,一次编译成功,但编译出的DotNetOpenAuth相关dll有20个,这么多dll引用起来不方便。发现DotNetOpenAuth提供了msbuild的配置文件,可以在编译时自动将dll文件进行合并(使用了ILMerge)。于是改用msbuild命令进行编译。

2. 用msbuild进行第一次编译

2.1. 使用的是DotNetOpenAuth的tools\drop.proj编译配置文件,为了加快编译速度,注释了下面的内容:

<!--<ItemGroup>
<ProjectsToBuild Include="$(ProjectRoot)samples\samples.proj">
<Properties>TargetFrameworkVersion=v4.5</Properties>
</ProjectsToBuild> --><!-- Sandcastle doesn't seem to be able to handle .NET 4.0 dependencies right now. --><!--
<ProjectsToBuild Include="$(ProjectRoot)doc\doc.proj">
<Properties>TargetFrameworkVersion=v4.5</Properties>
</ProjectsToBuild>
</ItemGroup>-->

2.2. 运行VS2012的命令行:Developer Command Prompt for VS2012

2.3. 运行msbuild命令:

msbuild tools/drop.proj

2.4. 编译成功

2.5. 在drops\v4.5\Debug文件夹中得到合并后的DotNetOpenAuth.dll。

3. 测试已编译的DotNetOpenAuth

3.1. 在另外的项目中引用已编译出的DotNetOpenAuth.dll

3.2. 编译后运行项目,出现错误提示:

Could not load file or assembly 'DotNetOpenAuth' or one of its dependencies. Strong name signature could not be verified. The assembly may have been tampered with, or it was delay signed but not fully signed with the correct private key. (Exception from HRESULT: 0x80131045)

从这个错误信息中可以解读出:需要对DotNetOpenAuth进行强签名。

4. 使用强签名进行msbuild编译

4.1.  生成公钥

生成公钥需要借助sn.exe(sn是Strong Name的缩写),它是Visual Studio/Windows SDK中自带的一个工具。运行sn.exe命令需要进入Developer Command Prompt for VS2012。

具体操作步骤如下:

4.1.1. 生成密钥对(公钥/私钥)并保存至.pfx文件中

sn -k mykeyfile.pfx

4.1.2. 将密钥对从文件安装至密钥容器中

sn -i mykeyfile.pfx mykeycontainer

4.1.3. 从存放密钥对的.pfx文件中导出公钥至.pub文件

sn -p mykeyfile.pfx mykeyfile.pub

4.1.4. 显示.pub文件中存放的公钥

sn -q -t mykeyfile.pub

4.2. 使用生成的公钥进行msbuild编译

msbuild /p:KeyPairContainer=mykeycontainer,PublicKeyFile="<full path>mykeyfile.pub" tools/drop.proj

4.3. 编译成功

5. 测试已进行强签名编译的DotNetOpenAuth

原以为问题到此就解决了,哪知测试结果出人意料——同样的错误!。。。后来恍然大悟,不放在GAC中,强签名怎么会起作用呢?

6. 将DotNetOpenAuth注册到GAC

6.1. 进入Developer Command Prompt for VS2012命令行

6.2. 运行gacutil命令:

gacutil /i DotNetOpenAuth.dll

6.3. 却出现错误提示:

Failure adding assembly to the cache: Strong name signature could not be verified.  Was the assembly built delay-signed?

6.4. 解决方法——用sn命令忽略对强签名进行验证:

sn -Vr *,<之前创建的公钥>

6.5. 然后再运行gacutil,注册就成功了。

Assembly successfully added to the cache

7. 测试已注册至GAC的DotNetOpenAuth

7.1. 本以为到这里应该大功告成了。。。可是在VS2012中添加引用时,在Assemblies中怎么也找不到DotNetOpenAuth。

DotNetOpenAuth不是已经注册到GAC中了吗?Assemblies不就是GAC中的assemblies吗?

7.2. 搜索网上的资料才了解到Visual Studio添加引用时的Assemblies与GAC一点关系没有,GAC是.NET程序运行时用到的东西,而且这里的assemblies只是VS专用的一个存放程序集的文件夹。可是我以前一直以为它显示的就是GAC中的程序集。是因为我的愚蠢呢,还是因为微软反直觉的设计?即使前者,好的设计应该——别让用户发呆(推荐阅读别让用户发呆——设计中的防呆策略)。

8. 问题解决

按通常的做法,在VS中添加引用时,选择Browse,选择DotNetOpenAuth.dll所存放的文件路径,点击OK。成功引用之后,编译/运行项目,就大功告成了。你会发现,已经在GAC中注册过的程序集,添加引用时,VS将自动将Copy Local属性设置为False;否则为True。这就是程序集在与不在GAC中的一个区别之处。

9. 参考资料

https://github.com/DotNetOpenAuth/DotNetOpenAuth/wiki/ContributorQuickStart

 
 
 
标签: .NET

OAuth的一个.NET开源实现的更多相关文章

  1. 【通信】Netty JBOSS提供的一个java开源框架

    Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序dsf. 也就是说,Netty 是一个基 ...

  2. 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研

    想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研 http://blog.csdn.net/testing_is_believing/article/details/22 ...

  3. Akka.NET是Java/Scala 流行框架Akka的一个 .NET 开源移植

    Akka.NET v1.0 已发布,支持Mono Akka.NET 是Java/Scala 流行框架Akka的一个 .NET 开源移植.可用于构建高并发,分布式和容错事件驱动的应用在 .NET 和 M ...

  4. 我发起了一个 .Net 开源 跨平台 GUI (界面开发框架)项目 HtmlCore

    大家好 , 我发起了一个 .Net 开源 跨平台 GUI (界面开发框架)项目 , 名字叫 HtmlCore  . 项目的一个主要目标是可以用 .Net 在 移动设备 上 开发 GUI 程序 (界面程 ...

  5. 我发起了一个 .Net 开源 数据库 项目 SqlNet

    大家好 , 我发起了一个 .Net 开源 数据库 项目 SqlNet . 项目计划 是 用 C# 写一个 关系数据库 . 可以先参考我之前写的 2 篇文章 : 谈谈数据库原理    https://w ...

  6. 如何参与一个GitHub开源项目?

    如何参与一个GitHub开源项目? 摘要:本文是Github官如何参与一个GitHub开源项目方给出的参与Github上开源项目的一些指导,对希望加入开源社区的开发者是一个不错的参考. 最近一年开源项 ...

  7. go语言的一个gui 开源 项目 https://github.com/andlabs/ui

    go语言的一个gui 开源 项目  https://github.com/andlabs/ui 1 安装  mingw-w64  链接地址: http://mingw-w64.sourceforge. ...

  8. Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了

    阿里妹导读:一年多前,Java 界最近发生了一件大事,阿里开源 Spring Cloud Alibaba,并推出首个预览版.Spring Cloud 本身是一套微服务规范,并不是一个拿来即可用的框架, ...

  9. 自己第一个github开源的感受

    自己在github上发布了开源<基于IOS的手机视频直播SDK>后,不到一个月,被人star了508次,fork了120次,这个成绩大大出乎了我自己的意料! github网址:https: ...

随机推荐

  1. Java设计模式(三)原型模型 适配器型号

    (五岁以下儿童)原型模型 Prototype 样机模型旨在复制一个现有对象来创建新对象.而不是通过的方式的实例.原型模式须要实现 Cloneable 接口.覆写clone方法,复制分为浅复制.深复制. ...

  2. Mobile开发的饕餮盛宴-Zoomla!波CMS2 x2.1正式宣布

    饕餮 [tāo tiè] 古代汉族神话传说中龙的第五子,是一种存在于传说.想象的神奇怪兽. 古书<山海经>介绍其特点是:其形状如羊身人面,其目在腋下,虎齿人爪.其音如婴儿. 作为中国本土软 ...

  3. ThinkPHP 3.2 开放 cache注缓存,过滤非法字符

    打开缓存配置文件 /Application/Common/conf/cache.php源代码如下面: <?php return array( //'配置项'=>'配置值' 'LAYOUT_ ...

  4. angularJS之使用指令封装DOM操作

    angularJS之使用指令封装DOM操作 创建指令 指令也是一种服务,只是这种服务的定义有几个特殊要求: 必须使用模块的directive()方法注册服务 必须以对象工厂/factory()方法定义 ...

  5. Backup and Recovery Strategies1

    2.1.Data Recovery Strategy Determines Backup Strategy 在设计备份策略.如若数据恢复需求和数据恢复战略启动.每种类型的数据恢复需要你采取相应的备份类 ...

  6. ASP.Net TextBox控件只允许输入数字

    原文:ASP.Net TextBox控件只允许输入数字 1.1.在Asp.Net TextBox 控件的 OnKeyPress 事件中指定输入键盘码必须为数字: <asp:TextBox ID= ...

  7. Java 实现迭代器(Iterator)模式

    类图 /** * 自己定义集合接口, 相似java.util.Collection * 用于数据存储 * @author stone * */ public interface ICollection ...

  8. linux通过建模工具Umbrello

    https://umbrello.kde.org/ Umbrello UML Modeller is a Unified Modelling Language (UML) diagram progra ...

  9. 快速构建Windows 8风格应用11-语义缩放

    原文:快速构建Windows 8风格应用11-语义缩放 本篇博文主要介绍为什么需要语义缩放.什么是语义缩放.如何构建语义缩放. 为什么需要语义缩放 如果用过Windows 8系统的开发者都知道在Win ...

  10. VBS学习日记(一个) 开始了解

    Vbs 一个 Windows 脚本,其代表 :Microsoft Visual Basic Script Editon.( 微软可视化BASIC 脚本版),VBS 是 Visual Basic 的的一 ...