代码之家  ›  专栏  ›  技术社区  ›  sebagomez

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

  •  5
  • sebagomez  · 技术社区  · 15 年前

    我在工作中遇到问题 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 回复  |  直到 15 年前
        1
  •  10
  •   Don Kirkby    15 年前

    我只是在和一个类似的问题作斗争。关键是要使用 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;
        }
    

    这将完全忽略版本号,并将已加载的库替换为任何名为“傻瓜库”的库引用。您可以使用 AssemblyName 如果您想更严格的话,可以使用类。 FooClass 可以是愚人库中的任何类。

        2
  •  2
  •   mfeingold    15 年前

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

    推荐文章