【问题标题】:Programmatically modify Assembly Binding以编程方式修改程序集绑定
【发布时间】:2009-12-08 20:07:37
【问题描述】:

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

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

但是怎么做?,我怎样才能修改我的应用程序,让它运行起来就像对配置文件进行了上述更改一样?

【问题讨论】:

  • 谢谢大卫......请告诉你你做了什么来修复 xml 的正确格式
  • 要格式化一段代码,你需要在它前面有一个空行,然后在每行代码的开头至少有四个空格。

标签: microsoft.build


【解决方案1】:

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

【讨论】:

  • 这与在不获取配置文件的 TFS 构建下运行的 MSTest 完美配合。
  • 我在调试器中遇到了一些问题,该事件仅针对资源程序集。在生产中就像一个魅力。谢谢!
【解决方案2】:

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

【讨论】:

  • 写配置文件是什么意思?我不想以编程方式修改它,我想像我的配置已经修改一样运行我的应用程序。
  • 不修改 - 构建。配置文件的内容是您可以传递给 AppDomain.CreateDomain 方法(在 AppDomainSetup 实例内)的参数之一。这样您就可以即时构建它
猜你喜欢
  • 2013-12-04
  • 2015-02-27
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多