Программное изменение привязки сборки

StackOverflow https://stackoverflow.com/questions/1869500

  •  18-09-2019
  •  | 
  •  

Вопрос

У меня проблема с работой Microsoft.Build.BuildEngine который должен быть исправлен путем изменения моего файла .exe.config, чтобы добавить следующее.

<?xml version ="1.0"?>
<configuration>
        <runtime>
           <assemblyBinding xmlns="urnchemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
                <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="3.5.0.0"/>
            </dependentAssembly>
                <assemblyIdentity name="Microsoft.Build.Engine" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
                <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="3.5.0.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

Моя проблема в том, что я не могу изменить файл, мне нужно исправить его с помощью кода, и я думаю, что это должно быть возможно, верно?

Но как? Как я могу изменить свое приложение, чтобы оно работало так, как если бы вышеуказанные изменения были внесены в файл конфигурации?

Это было полезно?

Решение

Я как раз боролся с подобной проблемой.Ключевым моментом является использование AppDomain.AssemblyResolve событие.Вот как выглядит мой код:

    public void LoadStuff(string assemblyFile)
    {
        AppDomain.CurrentDomain.AssemblyResolve += 
            new ResolveEventHandler(CurrentDomain_AssemblyResolve);
        var assembly = Assembly.LoadFrom(assemblyFile);

        // Now load a bunch of types from the assembly...
    }

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        var name = new AssemblyName(args.Name);
        if (name.Name == "FooLibrary")
        {
            return typeof(FooClass).Assembly;
        }
        return null;
    }

При этом номер версии полностью игнорируется и заменяется уже загруженной библиотекой на любую ссылку на библиотеку с именем «FooLibrary».Вы можете использовать другие атрибуты AssemblyName class, если вы хотите быть более строгим. FooClass может быть любым классом в сборке FooLibrary.

Другие советы

Один из способов сделать это — создать приложение начальной загрузки, которое при запуске запускало бы исходное приложение в отдельном домене приложения.Когда вы настроите новый домен, вы сможете создать файл конфигурации программным способом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top