如何在 dotnet 控制台应用程序中引用和使用同一程序集的多个版本?
How to reference and use multiple versions of same assembly in dotnet console application?
假设我的解决方案中有以下程序集文件参考:
- a.dll
- b.dll
- c.dll
- Main_43.dll
- a_40.dll
- b_40.dll
- c_40.dll
- Main_40.dll
我的控制台应用程序以前只加载前 4 个,因为客户端使用 Main_43.dll,它在内部使用 a、b 和 c dll 文件。现在,我必须向我的控制台应用程序添加一个新客户端,它将使用 Main_40.dll 这是 Main_43.dll 的旧版本(我必须使用旧版本。没有升级选项)。如上所示,我通过添加后缀“_40”重命名了此版本的 a、b 和 c dll 文件。
我已经在我的控制台应用程序中引用了所有这些。我如何根据传递给控制台应用程序的参数告诉应用程序使用 Main_43 或 Main_40,以及我如何确定 Main_40 将引用 a、b 和 c dll 文件适用于 v40,反之亦然?
此外,在我的程序中调用可能会在两个 dll 中的方法的最佳做法是什么?
我应该使用完整的参考名称,例如:
Main_40.Export exportData = new Main_40.Export();
或者有更好的方法吗?
程序集文件是强命名的
这就是我进行更改的方式。我创建了一个文件夹 'libs',在该文件夹下我有 2 个文件夹 v40 和 v43,我将 dll 1 到 4 放在 v43 中,其余的放在 v40 中,然后当我的 class 被调用时,我加载了 dll动态地。我还确保设置了 'Copy always',以便在构建期间始终将 dll 移动到该文件夹。
现在,当我点击将使用 v40 dll 的客户端构造函数时,我加载程序集路径,然后创建 main_40
的实例
protected const string mxMainDLLPath = @"libs\v40\Main_40.dll";
dynamic mainObj = null;
public ClientClass()
{
Assembly assembly = Assembly.LoadFrom(mxMainDLLPath );
Type T = assembly.GetType("Main_40.Export");
mainObj = Activator.CreateInstance(T);
}
现在要调用 Main_40.dll 中的任何方法,我可以做 mainObj.Export()。
感谢@NightOwl888 提供的所有帮助。
假设我的解决方案中有以下程序集文件参考:
- a.dll
- b.dll
- c.dll
- Main_43.dll
- a_40.dll
- b_40.dll
- c_40.dll
- Main_40.dll
我的控制台应用程序以前只加载前 4 个,因为客户端使用 Main_43.dll,它在内部使用 a、b 和 c dll 文件。现在,我必须向我的控制台应用程序添加一个新客户端,它将使用 Main_40.dll 这是 Main_43.dll 的旧版本(我必须使用旧版本。没有升级选项)。如上所示,我通过添加后缀“_40”重命名了此版本的 a、b 和 c dll 文件。
我已经在我的控制台应用程序中引用了所有这些。我如何根据传递给控制台应用程序的参数告诉应用程序使用 Main_43 或 Main_40,以及我如何确定 Main_40 将引用 a、b 和 c dll 文件适用于 v40,反之亦然?
此外,在我的程序中调用可能会在两个 dll 中的方法的最佳做法是什么? 我应该使用完整的参考名称,例如:
Main_40.Export exportData = new Main_40.Export();
或者有更好的方法吗?
程序集文件是强命名的
这就是我进行更改的方式。我创建了一个文件夹 'libs',在该文件夹下我有 2 个文件夹 v40 和 v43,我将 dll 1 到 4 放在 v43 中,其余的放在 v40 中,然后当我的 class 被调用时,我加载了 dll动态地。我还确保设置了 'Copy always',以便在构建期间始终将 dll 移动到该文件夹。
现在,当我点击将使用 v40 dll 的客户端构造函数时,我加载程序集路径,然后创建 main_40
的实例 protected const string mxMainDLLPath = @"libs\v40\Main_40.dll";
dynamic mainObj = null;
public ClientClass()
{
Assembly assembly = Assembly.LoadFrom(mxMainDLLPath );
Type T = assembly.GetType("Main_40.Export");
mainObj = Activator.CreateInstance(T);
}
现在要调用 Main_40.dll 中的任何方法,我可以做 mainObj.Export()。
感谢@NightOwl888 提供的所有帮助。