Assembly.LoadFrom () создает исключение - PullRequest
1 голос
/ 02 июля 2011
public Assembly LoadAssembly(string assemblyName) //@"D://MyAssembly.dll"

{
    m_assembly = Assembly.LoadFrom(assemblyName);
    return m_assembly;
}

Если я помещу «MyAssembly.dll» в D: и его копию в каталог «bin», метод успешно выполнится.Тем не менее, я удаляю любой из них, он выдаст исключение.Сообщение как ниже:

Не удалось загрузить файл или сборку 'MyAssembly, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null' или одну из ее зависимостей.Система не может найти указанный файл.

Я хочу загрузить сборку, которая существует в D :.почему мне нужно поместить его копию в каталог "bin" одновременно?

Ответы [ 2 ]

5 голосов
/ 02 июля 2011

Может быть, MyAssembly.dll относится к некоторой сборке, которой нет в каталоге. Поместите все сборки в один каталог.

Или вы можете обработать событие AppDomain.CurrentDomain, AssemblyResolve для загрузки необходимой сборки

private string asmBase ;
public void LoaddAssembly(string assemblyName)
{
    asmBase = System.IO.Path.GetDirectoryName(assemblyName);

    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    System.Reflection.Assembly asm = System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes(assemblyName));
}

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    //This handler is called only when the common language runtime tries to bind to the assembly and fails.

    //Retrieve the list of referenced assemblies in an array of AssemblyName.
    Assembly MyAssembly, objExecutingAssemblies;
    string strTempAssmbPath = "";
    objExecutingAssemblies = args.RequestingAssembly;
    AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();

    //Loop through the array of referenced assembly names.
    foreach (AssemblyName strAssmbName in arrReferencedAssmbNames)
    {
        //Check for the assembly names that have raised the "AssemblyResolve" event.
        if (strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(",")) == args.Name.Substring(0, args.Name.IndexOf(",")))
        {
            //Build the path of the assembly from where it has to be loaded.                
            strTempAssmbPath = asmBase + "\\" + args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll";
            break;
        }

    }
    //Load the assembly from the specified path.                    
    MyAssembly = Assembly.LoadFrom(strTempAssmbPath);

    //Return the loaded assembly.
    return MyAssembly;
}
1 голос
/ 02 июля 2011

Чтобы получить какие-либо конкретные исключения, вы можете попробовать это:

try
{
    return Assembly.LoadFrom(assemblyName);
}
catch (Exception ex)
{
    var reflection = ex as ReflectionTypeLoadException;

    if (reflection != null)
    {
        foreach (var exception in reflection.LoaderExceptions)
        {
            // log / inspect the message
        }

        return null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...