我们有一个asp.net 4.0项目,它使用了几个依赖于log4net 1.2.10.0版本的框架.今天我尝试包含一个依赖于log4net版本1.2.11.0的新框架,从那时起我就被困住了:
log4net 1.2.10.0有publickeytoken = 1b44e1d426115821
log4net 1.2.11.0有publickeytoken = 669e0ddf0bb1aa2a
由于这些不同,我不能通过web.config中的运行时元素使用程序集重定向(使所有框架使用相同版本的log4net)或代码库(仅使新框架使用版本1.2.11.0).
我有什么选择?
(以及为什么哔哔声会让log4net不断更改版本之间的publickeytokens,因为据我所知,丢失的密钥是在1.2.9.0和1.2.10.0版本之间切换的原因,他们是否再次丢失密钥?我会自愿提供我的Dropbox如果他们需要它,以保证安全......)
编辑:好的,所以log4net的人显然认为用两个密钥发布是一个好主意,但这意味着你使用的每个框架需要就他们喜欢的两种风格中的哪一种达成一致,或者那些框架不能正常工作在同一个应用程序域中.我是唯一发现这个可怕想法的人吗?如果每个人都这样做,那么一切都会崩溃,对吧?
Edit2:正如我所说,我没有在我的业务代码中使用log4net,但是我使用了几个依赖于1.2.10.0的框架,当我尝试使用依赖于1.2.11.0的新框架时出现问题(新密钥) ),所以Stefans的回答并不适用,因为新的框架会期望新的密钥,而不是旧的密钥
我有以下情况
项目A.
- Uses Castle Windsor v2.2
- Uses Project B via WindsorContainer
Run Code Online (Sandbox Code Playgroud)
项目B.
- Uses NHibernate
- Uses Castle Windsor v2.1
Run Code Online (Sandbox Code Playgroud)
在Project AI的bin文件夹中有dll Castle.DynamicProxy2.dll v2.2和NHibernate dll.现在问题是NHibernate依赖于Castle.DynamicProxy2.dll v2.1而不存在.我该如何解决这种情况.
我已经获得了2个预编译的dll:
Common.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f3b12eb6de839f43, processorArchitecture=MSIL
Common.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f3b12eb6de839f43, processorArchitecture=MSIL
Run Code Online (Sandbox Code Playgroud)
API差异示例:
我正在尝试将两者加载到一个项目中,以执行以下操作:
extern alias v10;
extern alias v20;
private static void UpgradeUser()
{
// Load old user
var userOld = new v10::Common.Data.UserData();
userOld.loadData("user.dat");
// Create new user
var userNew = new v20::Common.Data.UserData();
// Copy properties
userNew.FirstName = userOld._firstName;
userNew.LastName = userOld._lastName;
userNew.Age = userOld._age;
// Invoke method from v10 and v20 API
userOld.version();
userNew.DisplayVersion();
if (userNew.GetUserInfo() != userOld.getInfo())
{
throw new Exception("Discrepencies in upgrade ");
}
Console.WriteLine("Upgrade done!");
} …Run Code Online (Sandbox Code Playgroud) 我有两个对我的应用程序至关重要的库,这些库依赖于不同版本的log4net.dll.当我正在使用的第三方片段被调用时,尝试我的bin文件夹中的两个dll都会出现常见错误:
无法加载文件或程序集'log4net,Version = 1.2.10.0,Culture = neutral,PublicKeyToken = 1b44e1d426115821'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
有没有办法让应用程序可以引用这两个dll?第三方dll是Windsor的IOC容器和Paypal的API,这两者对这个应用程序至关重要.
我有一个项目,需要引用两个具有相同名称的DLL.DLL名称不强,具有相同的名称.
我需要访问每个DLL中的某些类型,但这些类型具有相同的完全限定名称.所以我们假设第一个是companyDLL.dll,someProduct.Type1第二个是companyDLL.dll someProduct.Type1.
如何Type1在同一个项目中访问这两个类?
我已经尝试过使用extern alias,但它需要我更改其中一个DLL的名称.
我找到了几个涉及这个问题的线索,但没有一个解决了我的问题.
我以前log4net version 1.2.10.0在我的ASP.NET服务中使用过.我已将其更新为当前版本log4net v2.0.8.0,由于某些第三方库,我还在我的内容中添加了以下行web.config以支持/重定向旧版本.
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.10.0" newVersion="2.0.8.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
Run Code Online (Sandbox Code Playgroud)
我也对这些消息内部异常感到困惑 :((System.IO.FileLoadException)ex.InnerException.InnerException).Message
无法加载文件或程序集'log4net,Version = 1.2.10.0,Culture = neutral,PublicKeyToken = 1b44e1d426115821'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
例外消息:
无法加载文件或程序集'log4net,Version = 2.0.8.0,Culture = neutral,PublicKeyToken = 1b44e1d426115821'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
可能以下几行指向FusionLog中的问题
警告:比较程序集名称导致不匹配:PUBLIC KEY TOKEN ERR:无法完成程序集的设置(hr = 0x80131040).探测终止
完整的FusionLog
===预绑定状态信息===日志:DisplayName = log4net,Version = 1.2.10.0,Culture = neutral,PublicKeyToken = …
怎么修?
我有2个第三方程序集,它们使用NewtonSoftJson.dll.捕获的是其中一个使用较旧的3.xx而另一个使用4.5.x. 所以在运行时,两个组件中至少有一个抱怨另一个.
我该如何解决这个问题?我可以设置服务,但代码和环境目前没有这样设置.在给定的时间内,它也可以安全地完成重构.
.NET世界中管理导致版本冲突的传递依赖项的最佳实践是什么?
详情:项目A取决于项目B,而项目B又取决于图书馆C.
也
项目A还依赖于项目X,它取决于库C的不同和(可能)不兼容的版本.
A-> B-> Cv1.0
&
A-> X-> Cv2.0
其中
Cv1.0 <> Cv2.0
有没有办法让这项工作?
可以在不使用GAC的情况下完成吗?
即使B和X只是二进制格式(源不可访问),它能否完成?
换句话说,有一种方法可以让Project B和X在项目A中一起使用时使用它们自己的依赖项而不会引起冲突.
注意:我意识到理想情况下我根本不应该有这个问题,但是由于对外部库的依赖扩展,这将是一个不可避免的副作用.所以我想知道它应该如何最好地处理它.
我的Visual Studio 2008项目引用了两个(外部)程序集(A + B),这两个程序集恰好引用了相同的第三个程序集(C).但是,程序集A期望程序集C具有一个公钥,该公钥与程序集B期望的公钥不同.
这是一个明显例外的例子:
无法加载文件或程序集'Newtonsoft.Json,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = 9ad232b50c3e6444'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
当然,我不能在同一目录中放置两个版本的C(只有公钥不同),因为它们的文件名是相同的.其次,我发现使用配置文件中的程序集绑定只允许版本映射,而不是公钥映射.
我还尝试将其中一个程序集C放在一个单独的目录中,并将CLR配置为在加载程序集时在该目录中进行搜索.不幸的是,我无法让它工作.
我知道重新编译其中一个外部库(其中一个恰好是开源的)可以解决这个问题,但如果不是绝对必要,我不想将这个负担添加到我的维护计划中.
所以我的问题是:如何引用程序集C的两个"版本",它们只有公钥不同?
UPDATE
我偶然发现了一个相关问题的答案,使用ilmerge提供了一个有趣的解决方案.我还没有检查过它,但对于遇到这个问题的人来说这可能是有用的.
我刚刚在我的项目中升级了log4net,并且遇到了一些程序集绑定问题,因为一个组件依赖于旧版本的log4net.
该组件预期的版本是
log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821
Run Code Online (Sandbox Code Playgroud)
我的版本是
log4net, Version=1.2.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a
Run Code Online (Sandbox Code Playgroud)
如何正确解析此绑定(只有一个api差异,此组件无关紧要).
我已经尝试将以下内容添加到我的web.config但它不起作用.
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" culture="neutral" />
<bindingRedirect oldVersion="1.2.10.0" newVersion="1.2.12.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud) .net assembly-resolution .net-assembly assembly-binding-redirect
在我的项目中,我的依赖层次结构存在问题.我在我的代码中使用了一个库(WriteableBitmapExtensions),我还有另一个第三方库,它也使用了WriteableBitmapExtensions.只有其他库与特定的旧版本密切相关,我的代码需要其最新版本的功能.
这是对依赖关系的描述: 
有类似的问题和解决方案,但他们通过配置文件在运行时使用程序集绑定解决它,但我不认为这与Silverlight应用程序兼容.
那么有没有办法在Silverlight上下文中解决这些不同版本的程序集依赖项?如果没有,我认为我的选择是:
1)我很可能会说服第三方库的供应商更新以使用最新版本的WriteableBitmapExtensions,但我更愿意不依赖它们使其保持最新状态.特别是因为WriteableBitmapExtensions项目仍在更新,我们经常利用他们的新功能.
2)由于WriteableBitmapExtensions是开源的,我想我可以将其源代码重新编译为新的程序集"MyWriteableBitmapExtensions"并在我的源代码中使用它.但是如果两个第三方库引用不同版本的WriteableBitmapExtensions,我将再次遇到这个问题.
我怀疑我将使用选项2,但我想知道在提交/重构之前是否有更好的方法(如其他问题中的运行时程序集绑定).谢谢!
我有一种情况,Docusign API引用RestSharp签名程序集,公钥标记为598062e77f915f75.在同一个项目中,我使用的是Twilio API,它也引用了未签名的Restsharp程序集,显然是使用了一个空的公钥令牌.
我可以同时进行一个或另一个工作,但不能同时进行,因为我不能同时添加有符号和无符号的RestSharp引用,因为它们都具有相同的名称.
当我有一个对已签名的程序集的引用时,Docusign部分可以工作,但Twilio代码错误与此:
Could not load file or assembly 'RestSharp, Version=105.2.3.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
Run Code Online (Sandbox Code Playgroud)
当我引用无符号程序集时,Docusign错误:
Could not load file or assembly 'RestSharp, Version=100.0.0.0, Culture=neutral, PublicKeyToken=598062e77f915f75' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
Run Code Online (Sandbox Code Playgroud)
有没有办法解决?
我已经尝试过在我能想到的每种组合中绑定重定向:
<dependentAssembly>
<assemblyIdentity name="RestSharp" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-100.0.0.0" newVersion="105.2.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity …Run Code Online (Sandbox Code Playgroud) .net ×8
c# ×7
assemblies ×3
dll ×3
log4net ×3
reference ×2
.net-3.5 ×1
asp.net ×1
docusignapi ×1
silverlight ×1
twilio ×1
versioning ×1