C# 如何在dotnet控制台应用程序中引用和使用同一程序集的多个版本?

C# 如何在dotnet控制台应用程序中引用和使用同一程序集的多个版本?,c#,.net,dll,console-application,.net-assembly,C#,.net,Dll,Console Application,.net Assembly,假设我的解决方案中有以下程序集文件引用: a、 动态链接库 b、 动态链接库 c、 动态链接库 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的旧版本(我必须使用旧版本,没有升级选项)。我已经为这个版本重命名了a、b和

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

  • a、 动态链接库
  • b、 动态链接库
  • c、 动态链接库
  • 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的旧版本(我必须使用旧版本,没有升级选项)。我已经为这个版本重命名了a、b和c dll文件,后缀为“_40”,如上所示

    我已经在我的控制台应用程序中引用了它们。如何根据传递给console app的参数告诉应用程序使用Main_43或Main_40,以及如何确保Main_40将引用适用于v40的a、b和c DLL文件,反之亦然

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

    Main_40.Export exportData = new Main_40.Export(); 
    
    还是有更好的办法


    程序集文件的强名称为

    ,因此我就是这样进行更改的。我创建了一个文件夹“libs”,其中有两个文件夹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的帮助

    OP,除非所有不同的程序集都是强名称,否则无法t@MickyD程序集文件的强名称为“”sn-vf a.dll'说它是有效的。其他人也是。公钥是一样的,你读过了吗?请注意,这些是针对.NET Framework的-似乎没有任何文档说明在.NET Core中是否可以这样做。@NightOwl888这些是项目中引用的程序集。我无法在GAC中注册这些DLL。它们都在包含exe的文件夹中。相关: