Loading 2 versions of assembly at runtime

前端 未结 3 939
没有蜡笔的小新
没有蜡笔的小新 2021-01-05 16:24

I\'ve been trying to crack this one over the last couple of weeks and have not found a good solution yet; hopefully I can get an answer here.

I have two assemblies (

相关标签:
3条回答
  • 2021-01-05 16:58

    I have had two versions of the same assembly loaded at the same time. It happened with a scenario just as you describe it.

    You have to convince the runtime to load the same version of ZC for both ZA and ZB. I have found two ways to do that:

    1. Use a bindingRedirect element in your App.config file. There are some details in this question.
    2. Use the AppDomain.AssemblyResolve event. There are some details in this answer.

    The only problem with AppDomain.AssemblyResolve is that it only triggers when the runtime can't find the requested version. If both versions are available, then you'll have to use the bindingRedirect. I have used the AppDomain.AssemblyResolve event and then added a safety check that makes sure the right version was loaded by looking through the assembly's referenced assemblies collection. If it isn't, I complain to the user that an old version of the library is lying around and tell them where it is.

    0 讨论(0)
  • 2021-01-05 17:00
        m_Assembly1 = Reflection.Assembly.LoadFile(IO.Path.Combine(System.Environment.CurrentDirectory, "Old Version\Some.dll"))
        m_Assembly2 = Reflection.Assembly.LoadFile(IO.Path.Combine(System.Environment.CurrentDirectory, "New Version\Some.dll"))
    
        Console.WriteLine("Old Version: " & m_Assembly1.GetName.Version.ToString)
        Console.WriteLine("New Version: " & m_Assembly2.GetName.Version.ToString)
    
        m_OldObject = m_Assembly1.CreateInstance("FullClassName")
        m_NewObject = m_Assembly2.CreateInstance("FullClassName")
    

    From here on out I used late binding and/or reflection to run my tests.

    .NET: Load two version of the same DLL

    0 讨论(0)
  • 2021-01-05 17:06

    Apart from Jonathan Allen excellent advice, a more "classical" way to resolve the problem is by loading the 2 versions in 2 different AppDomanis. You can then use .NET Remoting to make the two AppDomains comunicate. So ZA should create a new Appdomain, Load in this AppDomain ZB and invoke some operation in ZB via Remoting.

    Note that .NET Remoting has some requirements on the classes that you want to use (inheritance from MarshalByRef), and creating an AppDomain is an expensive operation.

    Hope this help

    0 讨论(0)
提交回复
热议问题