【问题标题】:How to reference and use multiple versions of same assembly in dotnet console application?如何在 dotnet 控制台应用程序中引用和使用同一程序集的多个版本?
【发布时间】:2018-02-16 08:00:23
【问题描述】:

假设我的解决方案中有以下程序集文件参考:

  1. a.dll
  2. b.dll
  3. c.dll
  4. Main_43.dll
  5. a_40.dll
  6. b_40.dll
  7. c_40.dll
  8. Main_40.dll

我的控制台应用程序以前只加载前 4 个,因为客户端使用内部使用 a、b 和 c dll 文件的 Main_43.dll。现在,我必须向我的控制台应用程序添加一个新客户端,它将使用 Main_40.dll,这是 Main_43.dll 的旧版本(我必须使用旧版本。没有升级选项)。如上所示,我通过后缀“_40”重命名了此版本的 a、b 和 c dll 文件。

我已经在我的控制台应用程序中引用了所有这些。如何根据我传递给控制台应用程序的参数告诉应用程序使用 Main_43 或 Main_40,我如何确定 Main_40 将引用适用于 v40 的 a、b 和 c dll 文件,反之亦然?

另外,在我的程序中调用可能在两个 dll 中的方法的最佳做法是什么? 我应该使用完整的参考名称,例如:

Main_40.Export exportData = new Main_40.Export(); 

或者有更好的方法吗?

程序集文件是强命名的

【问题讨论】:

标签: c# .net dll console-application .net-assembly


【解决方案1】:

所以这就是我进行更改的方式。我创建了一个文件夹“libs”,在该文件夹下我有 2 个文件夹 v40 和 v43,我将 dll 1 到 4 放在 v43 中,其余的放在 v40 中,然后当我的类被调用时,我动态加载 dll。我还确保设置了“始终复制”,以便在构建期间始终将 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 的所有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-02
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多