Динамический выбор сборки и загрузка во время выполнения - PullRequest
1 голос
/ 23 сентября 2011

У меня есть приложение, которое ссылается на Microsoft.Data.SqlXml.dll сборка (часть SQLXML ). Но на разных машинах, в зависимости от того, является ли это живая среда или тестовая среда, или локальный компьютер разработчика, устанавливаются разные версии SQLXML . Возникает проблема: в зависимости от конечного компьютера я должен скомпилировать приложение для правильной Microsoft.Data.SqlXml.dll сборки.

В Subversion я храню файлы csproj и dll, которые используются в реальной среде. Когда мне нужно локально протестировать модули, использующие преимущества Microsoft.Data.SqlXml.dll , я изменяю ссылку в проекте и возвращаю их обратно. Но несколько раз я забывал откатить изменения и проверял csproj и Microsoft.Data.SqlXml.dll с версией, которая не соответствовала SQLXML , установленной на работающем сервере. В результате я получил ошибки во время выполнения.

У меня вопрос: есть ли способ динамически загружать сборки во время выполнения? У меня может быть где-нибудь в приложении инструкция switch, которая будет загружать правильную сборку в зависимости от записи в app.config (например, env = "live | test | local")? Или, возможно, есть другой способ решения этой проблемы?

Спасибо, Pawel

1 Ответ

1 голос
/ 23 сентября 2011

От Microsoft page :

AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);

private Assembly MyResolveEventHandler(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=Assembly.GetExecutingAssembly();
    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="C:\\Myassemblies\\"+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;          
}

Естественно, вы должны изменить деталь //Build the path of the assembly, используя то, что вам нужно.

...