質問

作業に問題があります 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>

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

しかし、どうやってアプリケーションを変更すれば、構成ファイルに上記の変更が加えられたかのようにアプリケーションを実行できるのでしょうか?

役に立ちましたか?

解決

私はちょうど同様の問題に苦労していました。鍵となるのは、 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 つは、起動時に元のアプリを別のアプリドメインで起動するブートストラップ アプリを作成することです。新しいドメインをセットアップすると、プログラムで構成ファイルを構築できるようになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top