4

次のような構造で、アプリケーションのプライベートフォルダーに保存する必要がある同じアセンブリの複数のバージョンがあるシナリオがあります。

.\My.dll          // latest version, say 1.1.3.0
.\v1.1.1\My.dll   // version 1.1.1.0
.\v1.1.2\My.dll   // version 1.1.2.0

私の問題は、.Netランタイムが古いバージョンのいずれかを要求されると、常に最新バージョンを検出し、ビルド番号の不一致が原因で失敗してから、より適切な一致をプローブしようとすることです。

アセンブリには強い名前が付けられており、app.configでこの構成を使用しています。

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="My" 
                publicKeyToken="xxxxxxxx" culture="netural" />

                <bindingRedirect oldVersion="1.0.0.0-1.1.1.0" 
                    newVersion="1.1.1.0" />
                <bindingRedirect oldVersion="1.1.3.0-1.1.65535.65535" 
                    newVersion="1.1.3.0" />

                <codeBase version="1.1.1.0" href="v1.1.1\My.dll" />
                <codeBase version="1.1.2.0" href="v1.1.2\My.dll" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

うまくいけば、私がここで見逃したことがあります。AppDomain.AssemblyResolveイベントをリッスンすることで、これをコードで解決できることはわかっていますが、純粋な構成ソリューションを確認したいと思います。

更新:それで、ケントが想定したタイプミスであるバグを見つけました。culture="netural"である必要がありますculture="neutral"。とはいえ、タイプミスがなければ、codeBase各バージョンを指す要素を使用する場合、解決はうまく機能します。このシナリオでは、プロービング要素が機能していないようです。

4

2 に答える 2

1

ソリューション全体を見ないと、どこかにタイプミスがあるとしか思えません。これを自分で試してみたところ、fuslogvwの助けを借りて、機能させることができました。

アセンブリの 3 つのバージョンがあり、使用するアプリケーションが出力ディレクトリ内のバージョンよりも古いバージョンを参照しています。CLR は、リダイレクトと codeBase エントリを見つけて、正しい (古い) バージョンを読み込みます。

メールアドレスを教えていただければ、ソリューションをメールで送信できます。

ケント

于 2009-03-19T09:49:45.740 に答える
0

プローブパスを使用できますか?これを使用して、制御されていない(たとえば、サードパーティのリゾルバー-MSTestなど)が必要なアセンブリを探すように強制します。

<?xml version ="1.0"?>
<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <probing privatePath="v1.1.1;v1.1.2;"/>
        </assemblyBinding>
    </runtime>
</configuration>

詳細については、こちらをご覧ください

于 2009-03-18T20:25:18.043 に答える