关于程序集生成失败 -- 引用的程序集没有强名称的解决办法

简介:

关于程序集生成失败 -- 引用的程序集没有强名称的解决办法 

 我在PetShop4程序中加入了一个业务外观层,然后在业务逻辑层(PetShop.BLL)引用这个程序集,点“生成”,出现以下的错误:“程序集生成失败 -- 引用的程序集没有强名称”,原因是PetShop.BLL是强命名程序集,强命名程序集不能用普通程序集造成的。

        那么什么叫强命名程序集呢?我们知道,以前在Windows下开发程序时常会遭遇著名的“DLL Hell”问题,即动态链接库的向后兼容问题。微软在.Net产生前曾尝试使用COM组件的方式来解决DLL Hell问题,即使用Guid来唯一的标识每一个COM组件。但是,实际上使用COM组件(包括版本升级)也是一件颇为麻烦的事:为了运行COM组件就必须在组册表中对其进行注册,重新编译有可能破坏Guid从而导致原来引用此COM组件的程序不能正确运行,等等。

在.Net中,微软引入了一种新的解决方案:强命名程序集(Strong Name),以及与之配套的全局程序集缓存(GAC)来解决这个问题。

我们知道,.Net使用Name、Version、Culture、PublicToken四个属性来唯一标识一个程序集,而不同产品前三个属性(Name、Version和Culture)完全相同的情况是有可能发生的,如此一来,这唯一标识程序集可重任就落到PublicToken的头上了。强命名的程序集正是使用RSA来保证PublicToken的唯一性,因为在理论上,非对称算法RSA生成的公钥/私钥对不会重复。.Net正是通过在编译项目时将指定的公钥/私钥对写入程序集来保证其唯一性。

对于全局程序集缓存(GAC),MSDN是这样介绍的:安装有公共语言运行库的每台计算机都具有称为全局程序集缓存的计算机范围内的代码缓存。全局程序集缓存中存储了专门指定给由计算机中若干应用程序共享的程序集。

在开发一般的、非共享的程序时,我们不需要使用强命名的程序集,仅将项目(Project)编辑成.DLL或者.EXE即可。但是,如果我们开发的是组件库、框架时,通过对程序集进行强命名,并使用将其部署到GAC中,可以保证我们的程序集不会出现版本问题。

那么,如何创建强命名的程序集呢?以下是其步骤

  1. 使用SN工具来生成密钥对。该工具位于安装.NET Framework SDK的Bin目录中,在命令行中使用“ SN -k [驱动器号]:[放置密钥的目录][密钥名称].snk ”这样的语句可以生成密钥对。如,我们使用 SN -k C:/MySloutionKey.snk,可以把名为MySloutionKey.snk的密钥对文件生成到C盘根目录下;
  2. 此时,该密钥对并未与项目的程序集建立关联,我们需要打开项目(Project)的AssemblyInfo.cs 文件。此文件具有一个程序集属性列表,默认情况下,在 Visual Studio .NET 中创建项目时将包括这些属性。在代码中修改名为“AssemblyKeyFile”的属性,如下所示:

    [assembly:AssemblyKeyFile("C:/MySloutionKey.snk")]

  3. 这样,编译该项目即生成强命名的程序集。

         根据以上的说法,这个错误的解决问题如下:

首先打开visual studio 2005命令提示(开始-->程序-->microsoft visual studio 2005-->visual studio  tools-->visual studio 2005命令提示),在其中输入:sn  -k  PetShop.IBLL.snk回车,这样就生成了 PetShop.IBLL.snk,在路径C:/Program Files/Microsoft Visual Studio 8/VC找到 PetShop.IBLL.snk文件,放在IBLL项目的根目录也就是IBLL目录下,然后打开BLL项目的AssemblyInfo.cs,在里面加入如下代码行:[assembly: AssemblyKeyFile("PetSHop.IBLL.snk")], 然后重新生成PetShop.IBLL项目,这样一个强命名的程序集就生成了。

目录
相关文章
|
JSON IDE 测试技术
Google I/O :Android Jetpack 最新变化(二) Performance
Google I/O :Android Jetpack 最新变化(二) Performance
574 0
|
云计算
Matlab中读取txt文件的几种方法
Matlab中读取txt文件的几种方法 matlab读取文本文件的几种函数: 1、load——适合读取纯数据文本; 2、importdata——只读取数据,自动省略数据格式前后的字符,超大文件不适合; 3、textread、textscan——适合读取行列规整的文本,会存到元胞中,可通过he.
34372 0
|
机器学习/深度学习
神经网络与深度学习---验证集(测试集)准确率高于训练集准确率的原因
神经网络与深度学习---验证集(测试集)准确率高于训练集准确率的原因
4600 2
|
人工智能 前端开发 测试技术
Apipost 与 Apifox 深度对比:2025全方位解析助力 API 开发的利器
本文对比了Apipost与Apifox两款API开发与管理工具在功能、使用场景及用户评价等方面的差异。Apipost在API设计、调试、文档管理、Mock服务、离线支持及AI能力方面表现更优,尤其适合大型企业级项目和高效率需求的团队。而Apifox则适用于小型项目或对功能要求较低的团队。综合来看,Apipost在多方面具备明显优势,是高效、高质量API开发的理想选择。
533 24
|
SQL Oracle 关系型数据库
Oracle的PL/SQL中FOR语句循环游标的奇幻之旅
【4月更文挑战第19天】在Oracle PL/SQL中,FOR语句与游标结合,提供了一种简化数据遍历的高效方法。传统游标处理涉及多个步骤,而FOR循环游标自动处理细节,使代码更简洁、易读。通过示例展示了如何使用FOR循环游标遍历员工表并打印姓名和薪资,对比传统方式,FOR语句不仅简化代码,还因内部优化提升了执行效率。推荐开发者利用这一功能提高工作效率。
|
小程序 前端开发 Java
基于微信小程序的电影院订票选座系统的设计与实现(程序+数据库+)
基于微信小程序的电影院订票选座系统的设计与实现(程序+数据库+)
|
机器学习/深度学习 编解码 算法
【论文解析】CFPNet:用于目标检测的集中特征金字塔
【论文解析】CFPNet:用于目标检测的集中特征金字塔
897 0
【论文解析】CFPNet:用于目标检测的集中特征金字塔
|
关系型数据库 MySQL 应用服务中间件
用2核2G的入门级云服务器搭建WordPress博客系统
2核2G的云服务器能用来干嘛呢---个人建站。没错,就是搭建自己的博客网站,这类网站系统对服务器性能和内存要求都较低,而且云服务器自带公网IP,任何人都可以访问,后续也可以注册购买一个自己的域名,映射到云服务器的公网IP,妥妥的就是自己的个人网站了。
用2核2G的入门级云服务器搭建WordPress博客系统
el-carousel和el-image组合实现swiper左右滑动图片,点击某张图片放大预览的效果
el-carousel和el-image组合实现swiper左右滑动图片,点击某张图片放大预览的效果
|
NoSQL 前端开发 Java
JAVA餐厅收银系统(JAVA毕业设计)
JAVA餐厅收银系统(JAVA毕业设计)
344 0