如何在一个应用程序中加载不同版本的同一程序集?

时间:2018-02-05 07:40:25

标签: c# .net .net-assembly

我在C#中使用Windows窗体应用程序。我需要使用下面的dll。

Interop.SHDocVw.dll

问题是我需要引用同一个程序集的两个不同版本。

我尝试将dll保存在两个不同的位置&试图添加但不允许。

按照以下链接,我尝试在运行时加载两个版本的程序集,但不知何为不知道我该怎么做。

https://www.codeproject.com/Tips/373589/Load-same-assemblies-with-different-versions

这就是我的app.config的样子: -

<runtime>
<assemblyBinding  xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="Interop.SHDocVw.dll" publicKeyToken="db7cfd3acb5ad44e" />
    <codeBase version="1.1.0" href="...\watin-core\Interop.SHDocVw.dll"/>
  </dependentAssembly>

  <dependentAssembly>
    <assemblyIdentity name="Interop.SHDocVw.dll" publicKeyToken="632609b4d040f6b4" />
    <codeBase version="1.3.0" href="...\winforms\Interop.SHDocVw.dll"/>
  </dependentAssembly>

目前它抛出的例外: -

System.IO.FileLoadException: Could not load file or assembly 'Interop.SHDocVw, Version=1.1.0.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)
 File name: 'Interop.SHDocVw, Version=1.1.0.0, Culture=neutral, 
 PublicKeyToken=null'
 at myApp.AppUI.InitializeComponent()

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

,如http://geekswithblogs.net/narent/archive/2008/11/11/126940.aspx

1)编辑csproj文件(右键单击解决方案资源管理器中的项目,然后卸载项目,然后修改csproj文件)

2)在这个csproj文件中,添加包含Reference标签的ItemGroup: (这里是Office Interop 15和16的示例)

<Reference Include="Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">
  <HintPath>C:\Program Files (x86)\Microsoft Visual Studio\Shared\Visual Studio Tools for Office\PIA\Office15\Microsoft.Office.Interop.Excel.dll</HintPath>
  <Aliases>Test2</Aliases>
  <Private>False</Private>
</Reference>

<Reference Include="Microsoft.Office.Interop.Excel, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">
  <HintPath>C:\Program Files (x86)\Microsoft Office\root\Office16\DCF\Microsoft.Office.Interop.Excel.dll</HintPath>
  <Aliases>Test1</Aliases>
  <Private>False</Private>
</Reference>

如您所见,我添加了别名:Test1和Test2

3)然后,重新加载项目并在.NET代码中添加代码的第一行(在任何“使用”之前):

extern alias Test1;
extern alias Test2;

然后在您的代码中,您可以使用具有2个不同版本的相同程序集:

Test1.Microsoft.Office.Interop.Excel.Application app1;
Test2.Microsoft.Office.Interop.Excel.Application app2;

screenshot of the c# code window

.csproj file

答案 1 :(得分:-1)

我想当你说 - “你可以并排运行两个不同版本的同一个程序集”意味着你可以将两个版本的程序集加载到同一个应用程序域中。

这意味着在您的申请中:

Assembly1(假设你将cs proj命名为Assembly1)可以引用Interop.SHDocVw.dll 1.1版本

和Assembly2((假设你将你的cs proj命名为Assembly2)可以引用Interop.SHDocVw.dll的1.3版本。

你的最终o / p目录将包含Assembly1.dll,Assembly2.dll和两个版本的Interop.SHDocVw.dll。