如何解决本地DLL 的PublicKey Token与项目需要的DLL的PublicKey Token不一致的问题

article/2025/10/25 3:56:39

这个过程是这样的。有一个遗留的项目需要做一些修改,那么我就从TFS上把这个项目下载下来,用VisualStudio打开。编译时没有发现错误,直接运行。可是运行时就抛出了异常。

Could not load file or assembly 'log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821' or one of its dependencies. 
The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)":"log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"}

我的第一反应是这个Log4Net.dll找不到,觉得那么在reference列表中这个dll应该是黄色才对。右键查看项目引用的dll,发现Log4Net.dll正常引用,并没有黄色叹号,说明找到了这个dll.(后来想想也对,如果有黄色叹号标记的dll,那么说明找不到这个dll,那么编译的时候就应该报出异常,说找不到这个dll,所以由此总结,带黄色叹号的都是项目要用到的,但是没有在本地找到的,编译不会通过。如果没有黄色叹号抛出上边的异常,那么就是这个dll找到了,但是可能版本不一致。)

双击reference列表中的Log4Net.dll,可以看到其详细的信息,可以看出,这个dll指向的路径是GAC中,那么我就去GAC中找,确实在我本机找到了。


这个程序集存在于GAC中。那么我们查看一下这个Log4Net的dll信息。





果然,这里的publicKey Token与所需要的PublicKeyToken=1b44e1d426115821不一致。那么怎么解决这个问题?以前记得解决DLLversin不一样问题的时候,可以使用web.config或者app.config中的runtime节点进行redirect映射,那么publicTokenKey 可以吗?我找了找,没有找到相关配置。怎么办? 那么就去找指定publicKey token的dll吧。去哪里找?去Log4Net的官网找。确实,官网说明了它的dll变过publicKey token.



不过一般来讲,一个公司发布产品类型的dll,本不应该变换publickey Token签名的,否则会给用户带来像本文提到的这种问题,不同的人机器人可能安装了不同publickeytoken的签名版本,造成混乱。但是不知道为什么Log4Net却中途变了这个签名,有newkey与oldkey版本。

我下载了new key的版本,觉得这个应该是项目需要的,但是怎么确定一下这个下载来的dll的publickkeytoken呢?这里就可以用VS自带的工具。打开VS命令行,输入sn命令就可以。



由此可以看到这个publickey token不是。所以继续下载了oldkey的dll,使用同样的方法,最终证实确实是需要oldkey的版本。所以,我下载下来这个Log4Net.dll,然后在项目中建立一个Lib目录,把dll放进去,让项目对其添加引用。publickeyToken对了,此时我们需要看一下,那么版本对吗?右键查看这个新引用的dll的property,发现版本还真不对。项目需要Version=1.2.10.0,而这个新下载的是1.2.13.0,那么怎么办?这时就可以用版本映射来解决了。打开配置问题件,在节点中增加这些信息,意思就是需要1.2.10.0的时候,如果遇到了1.2.13.0,那么就可以认为找到了对应的dll。

 

至此,编译运行,发现问题解决,没有再报任何的异常。


一些题外话:

以上的问题,都是由于项目开发时候的不规范造成的。像Log4Net这样的非微软集成到GAC中的dll,就应该在项目中建立一个Lib目录存储下来,以后当有人下载代码的时候,能够连带dll一起下载到本地,不用再大费周章的去找对应版本了。现在有时候是用Nuget就很好,那么额外的dll全会放到package中,并且include到项目中。

 

还有关于dll version的映射问题,这个不是什么时候都OK的。

比如说,现在我用到了一个第三方的dll,叫做SuperLog.dll,这个dll是一个公司的产品,这个公司是引用EntrepriseLogging.dll,引用的是5.0的版本,并且在这个基础之上增加功能。我们在一个项目中用到了SuperLog.dll,我们加入这个SuperLog.dll,编译时告诉我们需要引入EntrepriseLogging.dll,但是我们手头只有EntrepriseLogging.dll6.0的版本。或许我们可以引入6.0的版本,但是重新映射到5.0版本。但是,我们这样做了,编译的时候还是遇到了问题。异常好像是说,EntrepriseLogging没有某个方法之类的。所以,这个意思就是说,以前5.0的时候,可能有一个方法A(),正好被SuperLog调用了。但是在6.0版本的时候,EntrepriseLogging决定不要这个方法了。所以在我们项目中,虽然没有抛出版本不一样的异常,但是当把6.0的版本当5.0的用,对这个6.0版本掉用A方法,但是没有,就抛出了异常。


一般来讲,第三方DLL发布新的版本,基本上不会更新对外暴露的方法,只是会更新方法中的内容。所以,不管哪个版本我们用到的都是同一个方法。但是如果真的对外的方法都变了,增加了活减少了什么的,那么就会遇到上边的问题。所以,不是所有的版本不同问题都能通过配置映射来解决。

 

为什么要有PublickKey Token?

其中一个很重要的原因就是安全角度考虑。这样说吧,某公司开发了一个桌面程序A.exe,然后安装包供下载。你下载完成,并且安装。那么,在你的ProgramFile里边,就有A.exe与一些供其调用的dll,比如说B.dll,当你运行A的时候,会调用B.dll,完成相应操作。现在,如果有某个非法程序偷偷的跑到A的目录中,找到B.dll,然后把自己写的同名的dll替换原来的。这时运行A的时候,调用B,就可能会有一些恶意非法操作。PublicKey的作用之一就是用来验证B是否是完全一致的B。验证机制比较复杂,大家可以进一步探索。



http://chatgpt.dhexx.cn/article/mil8IsQ9.shtml

相关文章

什么是publickeytoken及publickeytoken的作用

作者: 黄志彬(在dev-club上俺叫笨猫猫) 本人在看一些例子的时候,总是能看到配置文件中有一些publickeytoken的字样,本人不太明白,所以在网上搜了一下,看到msdn里边有人做了解释,恍然大悟,为了感谢作者,本人在这里转载一下.原文地址:http://www.microsoft.com/china/community/…

java drm_Linux DRM那些事-RockPI DRM

一、DRM基本组件 Linux内核DRM框架包括:GEM和KMS。引用网络图片,展示DRM大体框架: 1、GEM GEM(Graphic Execution Manager):图形执行管理器,主要是对 FrameBuffer 的管理,如内存的申请、释放、共享和同步(GPU和CPU之间…

Linux DRM(二) --Xorg/DRM

了解xorg 1.前言 GUI作为人机交互的一种方式,通过其承载的大量信息提高了信息交流的效率。这里我们不介绍鼠标、键盘等输入设备,只介绍输出显示这一子模块。生活中大家最常见的图形化界面估计就是图像化界面的桌面环境,即窗口系统。 窗口系统…

Linux DRM 理解

本文从如下几个部分介绍 1. DRM 概念介绍2. 对比HW结构分析3. code分析 1. DRM 概念介绍 DRM 是Direct Render Manager的缩写: Linux 显示子系统结构框架 向上提供标准API给到应用使用管理GPU和Display模块 相较于原来的framebuffer结构,DRM将更多的硬…

直接渲染管理器(Direct Rendering Manager, DRM)

这是一篇来至于wiki的译文,希望对学习DRM的同学有帮助。 目录 概述 软件架构 API DRM-Master and DRM-Auth 图形执行管理器(Graphics Execution Manager) Translation Table Maps DMA Buffer共享和PRIME KMS(Kernel Mode…

java drm_DRM系统工作原理

一、系统工作原理DRM技术是一项加强对音频、视频数字化产品内容版权保护的技术,其基本的工作原理是将音频、视频等文件进行加密编码处理,再建立一个证书授权服务中心;当用户使用这些加密文件时,应用软件会根据其包含在头文件中的有关属性自动链接到相应的站点(证书授权服务…

drm oracle,近距离接触RAC DRM

drm 是Oracle rac中独有的动态资源管理操作, 我们听了很多关于DRM的理论, 但是你是否亲眼见证过DRM, 今天我们就来看一下: SQL> select * from v$version; BANNER ---------------------------------------------------------------------…

菜鸟修炼笔记-音视频开发基础知识-drm简介

音视频开发基础知识-drm简介 前言一。DRM的基础概念1. DRM是什么?2. DRM的组成2.1 libdrm2.2 GEM2.3 KMS 二。KMS各个元素详解1. plane1.1 定义:1.2 类型1.3 功能1.4 使用:1.5 注意: 2. property2.1 定义和作用:2.2 常…

CSS字体的font-family属性和@font-face使用方法

CSS字体的font-family属性: font-family属性一共有5个字体系列,分别是: sans-serif: 包括没有衬线的字体,与serif相比,通常认为sans-serif在计算机屏幕上更容易识别。 serif: 包括有衬线的字…

前端漂亮的字体 font-family

今天在看UI图的时候看到这种字体,给大家分享分享,直接上图 图一 利用字体系列font-family div{font-size: .7rem;color: #ffeb7b;/* 黄色 */font-family: electronicFont; /* 这是重点!!! */ }图二 利用文字阴影text-…

【CSS】font-family的相关字体设置

大家都知道,在不同操作系统、不同游览器里面默认显示的字体是不一样的,并且相同字体在不同操作系统里面渲染的效果也不尽相同,那么如何设置字体显示效果会比较好呢?下面我们逐步的分析一下: 一、字体基础知识 css 中…

Web 字体 font-family 浅谈

前言 最近研究各大网站的font-family字体设置,发现每个网站的默认值都不相同,甚至一些大网站也犯了很明显的错误,说明字体还是有很大学问的,值的我们好好研究。 不同的操作系统、不同浏览器下内嵌的默认字体是不同的,错…

font-faimly字体大全

清 font-size:100px 为例 font-family:“Arial”,“Microsoft YaHei”,“黑体”,“宋体”,sans-serif; font-family:Tahoma,Helvetica,Arial,‘宋体’,sans-serif; font-family: ‘Microsoft YaHei’,arial,tahoma,\5b8b\4f53,sans-serif; font-family:Tahoma,Helvetica,A…

html字体设置font-family

<div ><p style"font-family:STHeiti">1.华文黑体:STHeiti</p><p style"font-family:STKaiti">2.华文楷体&#xff1a;STKaiti</p><p style"font-family:STSong">3.华文宋体&#xff1a;STSong</p>&l…

html常用font-family设置字体样式

<table border"1" cellpadding"0" cellspacing"0" ><tr><td><h3 style"font-family: 黑体;">黑体&#xff1a;SimHei</h3></td><td><h3 style"font-family: 华文黑体;">华…

font-family、font-style、font-weight、font-variant的区别「In CSS」

学习 CSS&#xff0c;看文档的时候总是对 font 的属性搞不清楚或者总是搞混。 这里总结一下这四个经常搞混的&#xff08;特别是前面两个&#xff09;。 font-family 这个属性指的是字体&#xff0c;比如说汉字中常说的行书与草书。 这个属性的值可以有多个&#xff0c;因为…

FontFamily 看这里就够了

TextView中字体设置 typeface 一、配置设置 代码方式设置 fontFamily 文字如何实现加粗、斜体&#xff1f; 三者之间的关系 自定义字体 参考&#xff1a; TextView中字体设置 textView中有三个属性可以设置字体 textStyle&#xff1a;设置样式fontFamily&#xff1…

WPF—WrapPanel布局

WrapPanel布局面板将各个控件从左至右按照行或列的顺序罗列&#xff0c;当长度或高度不够是就会自动调整进行换行&#xff0c;后续排序按照从上至下或从右至左的顺序进行。 Orientation——根据内容自动换行。当 Horizontal选项看上去类似于Windows资源管理器的缩略图视图&…

WrapPanel

WrapPanel将子元素自左向右逐个地排列, 若一个水平行中放不下,就排在下一行。面板的方向可以是水平或垂直的 <Window x:Class"Panel布局.WrapPanelxaml"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.…

WPF中5种内建面板Canvas、StackPanel、WrapPanel、DockPanel、Grid分析

https://blog.csdn.net/weixin_43437202/article/details/88292620 Canvas、StackPanel、WrapPanel、DockPanel和Grid是WPF中主要的5种内建面板&#xff0c;这些面板类都位于System.Windows.Controls命名空间下。 主要布局特点简述 Grid 按行列排列内容&#xff0c;如果没有特…