我的任务是为应用程序创建一个新模块,因此,我正在为项目添加新的DLL。这一切都很好。
然而,在我的DLL中,我想使用新版本的外部DLL(我无法控制)。如果我只引用新的DLL并仅使用那个DLL,我的代码将起作用,但旧代码将停止运行。
Could not load file or assembly 'itextsharp, Version=5.0.6.0, Culture=neutral,
PublicKeyToken=8354ae6d2174ddca' or one of its dependencies. The located assembly's
manifest definition does not match the assembly reference. (Exception from HRESULT:
0x80131040)
我尝试过一个改变DLL名称的简单技巧,但这显然对我来说太天真了,认为它会起作用。我已经尝试使用外部别名(通过在我的引用中定义它们),但我仍然不知道如何将两个具有相同名称的文件放入一个BIN文件夹...
我该怎么办?
答案 0 :(得分:14)
你可以load another version into a specific AppDomain
可能过于详细,但这篇文章演示了如何在有用的环境中使用AppDomains以及它们的工作方式:
http://msdn.microsoft.com/en-us/magazine/cc164072.aspx
从最基本的意义上讲,它归结为此示例代码:
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
...
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (/*some condition*/)
return Assembly.LoadFrom("DifferentDllFolder\\differentVersion.dll");
else
return Assembly.LoadFrom("");
}
答案 1 :(得分:5)
另一个可行的选择是使用extern
,如下所述:
http://blogs.msdn.com/b/abhinaba/archive/2005/11/30/498278.aspx
答案 2 :(得分:2)
如果AppDomains解决方案不适用于您的情况,那么您将面临时间压力,需求相互冲突(例如 ),并且不介意可笑的恶意攻击:
答案 3 :(得分:1)
您还可以依赖http://msdn.microsoft.com/en-us/library/2fc472t2.aspx中描述的强命名程序集的程序集绑定重定向。
您只有一个版本的文件(最新版本),两个引用都会解析它。