ASP.NET:FileLoadException尝试使用同一个dll的两个不同版本时

时间:2015-08-06 19:54:46

标签: asp.net .net dll fileloadexception

所以我需要在同一个解决方案中使用相同dll的两个不同版本,我通过使用extern aliases设法做到了(任何试图使用相同dll的两个不同版本的人都应该尝试{{3} })。事情是,现在我的应用程序开始运行时,我得到这个FileLoadException HRESULT:0x80131040。有人知道这个问题的可能原因和/或解决方案吗?

是的,我不得不更改其中一个dll的名称,不,只是在这个时刻使用后一个版本是不可能的。

1 个答案:

答案 0 :(得分:0)

我设法使用appDomain使用相同dll的两个不同版本。它非常干净且始终有效,但是,它涉及反射和appDomain创建,这是性能关键应用程序的开销。以下是如何在控制台应用程序中完成,您可以在asp.net中执行相同的操作:

//Console app
using System;
using System.IO;
using System.Reflection;

namespace ConsoleApp1
{
class Program
{
    static System.AppDomain oldAssemblyDomain = null;
    static System.AppDomain newAssemblyDomain = null;

    static void Main(string[] args)
    {
        LoadOldVersion();
        LoadNewVersion();

        Console.ReadLine();
    }

    private static void LoadOldVersion()
    {
        oldAssemblyDomain = System.AppDomain.CreateDomain("oldAssemblyDomain", null);
        oldAssemblyDomain.DoCallBack(()=>{
            string dllName = "ClassLibrary1.dll";
            Assembly assembly = Assembly.LoadFile(Directory.GetCurrentDirectory() + @"\" + dllName);
            Type type = assembly.GetType("ClassLibrary1.Class1");
            MethodInfo minfo = type.GetMethod("SayHello", BindingFlags.Public | BindingFlags.NonPublic |
                      BindingFlags.Static | BindingFlags.Instance);
            var returnValue=minfo.Invoke(Activator.CreateInstance(type), null);
            Console.WriteLine(returnValue.ToString());
        });
    }

    private static void LoadNewVersion()
    {
        newAssemblyDomain = System.AppDomain.CreateDomain("newAssemblyDomain", null);
        newAssemblyDomain.DoCallBack(() =>
        {
            string dllName = "ClassLibrary2.dll";
            Assembly assembly = Assembly.LoadFile(Directory.GetCurrentDirectory() + @"\" + dllName);
            Type type = assembly.GetType("ClassLibrary1.Class1");
            MethodInfo minfo = type.GetMethod("SayHello", BindingFlags.Public | BindingFlags.NonPublic |
                      BindingFlags.Static | BindingFlags.Instance);
            var returnValue = minfo.Invoke(Activator.CreateInstance(type), null);
            Console.WriteLine(returnValue.ToString());
        });
    }
}
}


//Lib
namespace ClassLibrary1
{
public class Class1
{
    public static string SayHello()
    {
        return "Hello 1";
    }
}
}