.Net解决引用程序集没有强名称报错

目录
  • 一、什么是强名称
    • 为什么要使用强名称签名
  • 二、如何设置强名称
    • 1、应用程序有源代码
      • 1、生成公钥
      • 2、设置签名公钥
    • 2、应用程序没有源代码
      • 1、打开SDK命令提示窗口
      • 2、创建一个新的随机密钥对
      • 3、反编译目标程序集
      • 4、重新编译,附带强命名参数
      • 5、验证签名信息
      • 6、重新引用

一、什么是强名称

强名称是一个由程序集的标识组成并通过公钥和数字签名(针对该程序集生成)加强的名称,其中的标识包括程序集的简单文本名称、版本号和区域性信息。

由于程序集清单包含构成程序集实现的所有文件的文件散列,因此只对程序集中包含程序集清单的一个文件生成数字签名就足够了。强名称相同的程序集应该是相同的。

为什么要使用强名称签名

通过签发具有强名称的程序集,您可以确保名称的全局唯一性。强名称还特别满足以下要求:

  • 强名称依赖于唯一的密钥对来确保名称的唯一性。任何人都不会生成与您生成的相同的程序集名称,因为用一个私钥生成的程序集的名称与用其它私钥生成的程序集的名称不相同。
  • 强名称保护程序集的版本沿袭。强名称可以确保没有人能够生成您的程序集的后续版本。用户可以确信,他们所加载的程序集的版本出自创建该版本的同一个发行者。
  • 强名称提供可靠的完整性检查。通过.NET框架安全检查后,即可确信程序集的内容在生成后未被更改过。但请注意,强名称中或强名称本身并不暗含某一级别的信任,例如由数字签名和支持证书提供的信任。
  • 在引用具有强名称的程序集时,您应该能够从中受益,例如版本控制和命名保护。如果此具有强名称的程序集以后引用了具有简单名称的程序集,则您将失去使用具有强名称的程序集带来的好处,并依旧会产生DLL冲突。因此,具有强名称的程序集只能引用其他具有强名称的程序集。

注意:强名称的应用程序只能引用强名称的dll,不能引用未强名称的dll,但是未强名称的dll可以引用强名称的dll。

二、如何设置强名称

上面我们讲了什么是强签名,以及强签名的好处,下面我们来看看如何给应用程序设置强名称。

1、应用程序有源代码

打开vs tool command,如下图所示:

1、生成公钥

然后进入要设置强名称的dll文件所在的路径,使用下面的命令生成签名公钥:

sn -k StrongName.snk

如下图所示:

2、设置签名公钥

将公钥加入项目中,并设置项目属性,设置签名公钥:

最后重新生成项目即可。

2、应用程序没有源代码

如果项目中引用了其它第三方的dll文件,而且还没有源代码,并且此dll文件是没有强名称的程序集,则在编译时会出现类似“程序集生成失败--引用的程序集XXX没有强名称”。

比如我在程序中使用到了Dapper,而Dapper是没有强名称的,所以生成的时候报错了,如下图所示:

这时我们就需要把Dapper变成有强名称的程序集。

1、打开SDK命令提示窗口

我们这里以VS 2012为例打开SDK命令提示窗口,如下图所示:

然后需要进入Dapper.dll文件所在的目录:

2、创建一个新的随机密钥对

使用下面的命令生成一个随机的密钥对。

sn -k Dapper.snk

如下图所示:

3、反编译目标程序集

使用下面的命令反编译目标程序集,该指令会反汇编该dll并生成Dapper.il,如果该dll含有嵌入的resource,则会有Dapper.res文件产生,并有相应的嵌入资源文件产生。

ildasm Dapper.dll /out=Dapper.il

如下图所示:

4、重新编译,附带强命名参数

使用下面的命令重新编译Dapper.dll,然后会附带强命名参数

ilasm Dapper.il /dll /resource=Dapper.res /key=Dapper.snk /optimize

如下图所示:

这样就表示编译成功了。

5、验证签名信息

编译成功以后,我们使用下面的命令来验证重新编译后的dll文件是否带有强名称

sn -v Dapper.dll

如下图所示:

这就表示重新编译后的dll文件有了强名称。

6、重新引用

编译成功以后,会在目录下面生成这么几个文件:

可以看到:Dapper.dll这个文件是最新生成的,我们在项目里面重新引用上面新编译的Dapper.dll文件,然后重新编译项目:

可以看到,这时就不会报Dapper.dll没有强名称的错误了。其它没有强名称的dll文件也使用同样的方式进行处理。

到此这篇关于.Net解决引用程序集没有强名称报错的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SQL Server中调用C#类中的方法实例(使用.NET程序集)

    需求是这样的,我在.net程序里操作数据时将一些字段数据加密了,这些数据是很多系统共用的,其中一delphi程序也需要用到,并且需要将数据解密,由于我在.net里加密的方式比较特殊,在delphi程序里解密比较繁琐且要消耗很多时间,所以不得不让sqlserver调用程序集的方式来解决问题. 下面只是一个例子,贴出来共享. 建立一个dll,class,代码如下: 复制代码 代码如下: namespace MyDll {     public partial class MyClass     {

  • PowerShell中使用.NET将程序集加入全局程序集缓存

    通常情况下,将程序集(Assembly)加入全局程序集缓存(GAC,Global Assembly Cache),可以使用GacUtil工具.只要使用/i参数,就可以把指定路径的程序集添加进GAC了. 不过由于GacUtil并不是.Net Framework的一部分,而是和Windows SDK一起发布的,这就导致了机器中安装了.Net,却可能找不到GacUtil的情况. 在PowerShell中,我们可以直接使用.Net的类库来搞定这件事,而不需要通过GacUtil.具体代码如下: [Refl

  • .NET应用程序集DLL与EXE工作机制及原理介绍

    .NET 中的程序集是什么? 根据 MSDN 的说法,程序集是 .NET Framework 应用程序的构建基块;它们构成了部署的基本单位.简单地说,我们可以说,程序集只不过是一个预编译的 .NET 代码,可以由 CLR(通用语言运行时)运行. 让我们以一个示例来理解上述定义.为了理解这一点,让我们创建一个名称为 MyConsoleApp 的简单控制台应用程序.创建控制台应用程序后,请修改程序类,如下所示. 现在,如果您右键单击项目并单击文件资源管理器中的"打开文件夹",您将发现许多内

  • .NET Core 3.0 可回收程序集加载上下文的实现

    一.前世今生 .NET诞生以来,程序集的动态加载和卸载都是一个Hack的技术,之前的NetFx都是使用AppDomain的方式去加载程序集,然而AppDomain并没有提供直接卸载一个程序集的API,而是要卸载整个AppDomain才能卸载包含在其中的所有程序集.然而卸载整个CurrentAppDomain会使程序不能工作.可能有人另辟西经,创建别一个AppDomain来加载/卸载程序集,但是由于程序集之间是不能跨域访问的,也导致只能通过Remote Proxy的方式去访问,这样在类型创建和使用

  • 如何合并多个 .NET 程序集

    任何曾今寻找过一个将多个程序合并到一个文件中的解决方案的人,可能都听说过项 ILMerge, SmartAssembly, 等这样的工具. 另外一个知名的方案是将DLL作为资源进行嵌入(如果感兴趣,这里有一篇描述这一方案的精彩文章:从嵌入的资源出载入DLL[^]). 而在某些情况中,我意识到有必要使用这些方法.如果我们有了这些汇编的源代码,我们就能通过在编译时将所有这些源代码文件导入一个项目,来获得这些东西的一个完美组合. 在这里我将尝试对如何做到这件事进行简要的描述. 为了进行演示,让我们假设

  • asp.net 未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。

    说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.BadImageFormatException: 未能加载文件或程序集"XXX"或它的某一个依赖项.试图加载格式不正确的程序. 源错误: 执行当前 Web 请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息. 程序集加载跟踪: 下列信息有助于确定程序集"XXX"无法加载的

  • .Net解决引用程序集没有强名称报错

    目录 一.什么是强名称 为什么要使用强名称签名 二.如何设置强名称 1.应用程序有源代码 1.生成公钥 2.设置签名公钥 2.应用程序没有源代码 1.打开SDK命令提示窗口 2.创建一个新的随机密钥对 3.反编译目标程序集 4.重新编译,附带强命名参数 5.验证签名信息 6.重新引用 一.什么是强名称 强名称是一个由程序集的标识组成并通过公钥和数字签名(针对该程序集生成)加强的名称,其中的标识包括程序集的简单文本名称.版本号和区域性信息. 由于程序集清单包含构成程序集实现的所有文件的文件散列,因

  • 解决iview打包时UglifyJs报错的问题

    使用npm run dev时运行是ok的,但是npm run build打包时iview报错, 如下: 原因是iview中使用了es6语法,然而uglifyJs是不支持的,打开我们的build/webpack.prod.conf.js文件,可以看到 // UglifyJs do not support ES6+, you can also use babel-minify for better treeshaking: https://github.com/babel/minify new we

  • 三个思路解决laravel上传文件报错:413 Request Entity Too Large问题

    最近一个项目当中,要求上传图片,并且限制图片大小,虽然在laravel当中已经添加了相关的表单验证来阻止文件过大的上传,然而当提交表单时,还没轮到laravel处理,nginx就先报错了.当你仔细看报错页面时,你会发现有nginx版本信息,经过分析,这报错是因为nginx的默认上传文件大小配置client_max_body_size只有2MB, 基于nginx验证比laravel验证要早,想要友好报错而不是直接显示413 Request Entity Too Large,那么就有三个思路去解决.

  • 解决maven启动Spring项目报错的问题

    第一个问题 java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer 出现原因主要是 javax.servlet-api 在运行时将spring容器当成了servlet容器出现类型转换错误. 解决方法: 在pom.xml文件中修改 javax.servlet-a

  • 解决java junit单元测试@Test报错的问题

    在我们在myeclips里使用junit测试工具时有时会遇到错误,这是什么原因呢? 导致问题的原因通常有下面几个: (1)没有导入jar包 (2)导入jar包版本太低 (3)注意@Test要写在方法上面 如果不是几种问题,那便试试下面的解决方案: 1.在项目上点击右键,出现下图内容,选择properties 2.出现如下对话框,点击java build path,再选择add Library 3.之后如下图操作 4.选择junit4,点击finish,配置完毕. 以上这篇解决java junit

  • 解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available

    简述 从官网下载了Python3.7.4,直接编译安装后,使用pip3出现了报错信息: Can't connect to HTTPS URL because the SSL module is not available 错误原因 在Python3.7之后的版本,依赖的openssl,必须要是1.1或者1.0.2之后的版本,或者安装了2.6.4之后的libressl. image.png 而本地的openssl依然是1.0.1e的. [root@localhost ~]# openssl ver

  • 解决使用export_graphviz可视化树报错的问题

    在使用可视化树的过程中,报错了.说是'dot.exe'not found in path 原代码: # import tools needed for visualization from sklearn.tree import export_graphviz import pydot #Pull out one tree from the forest tree = rf.estimators_[5] # Export the image to a dot file export_graphv

  • 解决vue 引入子组件报错的问题

    错误信息: Do not use built-in or reserved HTML elements as component id: header 源码: <script> import header from "./components/header" import aside from "./components/aside" import footer from "./components/footer" export de

  • 解决pip install的时候报错timed out的问题

    安装包的时候报错,执行:pip install pyinstaller 问题: File "c:\python\python35\lib\site-packages\pip\_vendor\requests\packages\urllib3\response.py", line 357, in stream data = self.read(amt=amt, decode_content=decode_content) File "c:\python\python35\lib

  • 在vue中解决提示警告 for循环报错的方法

    警告 1.出现这个警告问题的时候 我们可以去main.js中在头部添加这句话: Vue.config.productionTip = false 这样即可去除警告! 2.在build文件下的webpack.base.conf.js文件中, 将 ...(config.dev.useEslint ? [createLintingRule()] : []),注释掉, const createLintingRule = () => ({ test: /\.(js|vue)$/, loader: 'esl

随机推荐