6

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

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

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

4

2 回答 2

11

我只是在为类似的问题而苦苦挣扎。关键是使用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 程序集中的任何类。

于 2010-02-26T20:27:07.713 回答
2

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

于 2009-12-08T20:36:49.727 回答