2009-12-08 3 views
5

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> 

私の問題は、ファイルを変更できないため、コードで修正する必要があり、それは可能だと思いますよね?

しかし、どうすれば私のアプリケーションを変更して、上記の変更が設定ファイルで行われたかのように動作させることができますか?

+0

おかげでデビッド...コードのブロックをフォーマットするには、XML – sebagomez

+0

の正しい書式を修正するためにあなたは何をしたか教えてください、あなたはそれの前に空白行を必要とし、その後、少なくとも4つのスペースの各行の先頭にコード。 –

答えて

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アセンブリ内の任意のクラスを指定できます。

+0

でそれを構築することができます。この方法では、これはMSTestをは、設定ファイルをピックアップしていないTFSのビルドの下で実行されていると完璧に働きました。 –

+0

私はデバッガにいくつかの問題がありました。デバッガでは、このイベントがリソースアセンブリに対してのみヒットしました。生産では魅力のように動作します。ありがとう! –

2

これを行う1つの方法は、起動時に別のappdomainで元のアプリを起動するブートストラップアプリを作成することです。新しいドメインを設定すると、設定ファイルをプログラムでビルドすることができます。

+0

設定ファイルを書いてどういう意味ですか?私はプログラム的にそれを変更したくない、私は私の設定がすでに変更されたかのように私のアプリを実行したいです。 – sebagomez

+2

変更しないでください。設定ファイルの内容は、(AppDomainSetupインスタンス内)AppDomain.CreateDomainメソッドに渡すことができるパラメータの一つです。あなたはその場 – mfeingold

関連する問題