以编程方式修改程序集绑定

时间:2009-12-08 20:07:37

标签: microsoft.build

我在使用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>

我的问题是,我无法修改文件,我必须通过代码修复它,我认为这应该是可能的,对吧?

但是如何?,如何修改我的应用程序,使其运行,就好像在配置文件上进行了上述更改一样?

2 个答案:

答案 0 :(得分:10)

我正在努力解决类似的问题。关键是使用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类的其他属性。 FooClass可以是FooLibrary程序集中的任何类。

答案 1 :(得分:2)

这样做的一种方法是创建一个引导应用程序,该应用程序在启动时会在单独的应用程序域中启动您的原始应用程序。设置新域时,您将能够以编程方式构建配置文件。