2011-05-06 72 views
18

我的任务是为应用程序创建一个新模块,所以我将新的DLL添加到项目中。这一切都很好。使用同一个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文件夹中...

我该怎么办?

回答

10

您可以load another version into a specific AppDomain

可能太详细了,但这里是演示在一个有用的设置使用的AppDomain的文章,他们是如何工作的:

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(""); 
    } 
+0

不像我所希望的那么漂亮,但它完成了工作。谢谢! – Shaamaan 2011-05-06 21:31:29

+1

我已经允许自己编辑您的答案,以包含我用于解决问题的代码示例。但主要原因是第二个环节已经很长时间了。你能否偶然地将类似的资源与旧的资源联系起来? – Shaamaan 2015-09-08 13:19:08

+1

@Shaamaan我无法找到原始链接提到:(这是一个很好的入口页面,可能是一个很好的替代品:https://msdn.microsoft.com/en-us/library/ms172158(v=vs .110).aspx – sehe 2015-09-08 13:47:37

0

如果应用程序域解决方案并不适用于你的情况,你是在时间压力下,有矛盾的要求(如没发生),并且不介意可笑做作黑客:

  • 反编译使用ildasm工具组件的新版本(的一部分包含在Visual Studio中的开发人员命令提示符)
  • 编辑生成的.il文件以查找/替换程序集名称空间引用。使用引用的例子,这将是从itextsharp.X更改itextsharp.new.X
  • 同样,编辑为AssemblyTitleAttribute值。这需要将ASCII字符转换为十六进制。
  • 重新编译使用ilasm
  • 注意,这可能需要重复任何依赖程序集的.il内的文件(例如 - someassembly.core.whatever)
  • 添加新的.dll到你的项目使用不同的名称并明确地引用它们(而不是通过nuget或其他)

嘿,别看着我那样。我确实说可笑地做作了黑客...