C# 如何同时使用.dll和依赖于不同版本的.dll的第三方库

C# 如何同时使用.dll和依赖于不同版本的.dll的第三方库,c#,.net,.net-assembly,C#,.net,.net Assembly,我的应用程序和测试依赖于.NET供应商库和System.Data.SQLite。供应商库也依赖于System.Data.SQLite,但版本不同。我的申请包括: C#WinForm应用程序 使用C++/CLI与供应商库接口的C++应用程序 C#在Visual Studio中运行或由自定义可执行文件运行的单元测试(可高度配置重复运行、更改测试设置等) 使用dependentAssembly为C#WinForm应用程序修改app.config非常简单。我们将旧的SQLite DLL放在一个子目录

我的应用程序和测试依赖于.NET供应商库和System.Data.SQLite。供应商库也依赖于System.Data.SQLite,但版本不同。我的申请包括:

  • C#WinForm应用程序
  • 使用C++/CLI与供应商库接口的C++应用程序
  • C#在Visual Studio中运行或由自定义可执行文件运行的单元测试(可高度配置重复运行、更改测试设置等)
使用
dependentAssembly
为C#WinForm应用程序修改app.config非常简单。我们将旧的SQLite DLL放在一个子目录中,并使用以下命令重定向到它:

<dependentAssembly>
   <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" />
   <codeBase version="1.0.98.0" href="SQLite_v1.0.98\System.Data.SQLite.dll" />
</dependentAssembly>
除非在调用
preload()
之前应用程序使用SQLite 1.0.105,否则这种方法是有效的。我不想强制所有应用程序在启动应用程序时首先调用
preload()
,所以我想问是否有更好的方法

例如,是否有一种简单的方法可以将供应商库(实际上是一组dll)与其较旧的SQLite.dll一起放在子目录中,这样供应商dll将使用该较旧的SQLite,而所有其他第一方代码(dll和EXE)将使用较新的SQLite?再次,最好不要使用.C++应用程序和单元测试转发器的配置文件。 更新: SQLite DLL的两个版本具有相同的名称。官方的
System.Data.SQLite.dll
。我有另一个供应商依赖关系,我已经将其更新为使用我们使用的同一个SQLite版本(105)。根据@MickyD的评论,我试图将我们的SQLite文件更改为不同的名称:
System.Data.SQLite.105.dll
。但后来我犯了一个错误:

无法加载文件或程序集System.Data.SQLite, 版本=1.0.105.2,区域性=中性,PublicKeyToken=db937bc2d44ff139' 或者它的一个依赖项。找到的程序集的清单定义 与程序集引用不匹配

由于这个其他供应商依赖项没有强名称,所以我可以对其进行反编译/重新编译(事实上,我已经将其更新为105)。因此,我尝试更新名称以添加.105后缀:

.assembly extern System.Data.SQLite.105
{
  .publickeytoken = (DB 93 7B C2 D4 4F F1 39 )                         // ..{..O.9
  .ver 1:0:105:2
}
这给了我一个重新编译的错误:

正在将“B.il”组装到DLL-->“B.DLL”

源文件是ANSI

B.il(57):错误:。程序集外部中的标记“.105”处出现语法错误 System.Data.SQLite.105

*****失败*****


每一次都被挫败了

通常每个dll都有一个强名称,然后您可以轻松地将它们加载到相同的
AppDomain
。如果它们不是强名称,那么唯一的方法是创建一个子
AppDomain
,并将第二个dll(以及所有相关的客户端代码)加载到所述域中。SQLite dll是强名称的。但是,如果我试图简单地将子目录添加到privatePath(
),它将不起作用。
方法确实有效。如果它们都是强名称且具有唯一的文件名(例如sqlitev1.dll;sqlitev2.dll),则只需引用这两个名称即可。工作完成了。不需要配置。不需要绑定重定向。不需要子
AppDomain
。不需要装配解析程序。
.assembly extern System.Data.SQLite.105
{
  .publickeytoken = (DB 93 7B C2 D4 4F F1 39 )                         // ..{..O.9
  .ver 1:0:105:2
}