2016-09-14 2 views
0

サードパーティDLLのセット、バージョンv1.1に依存するアプリケーションがあります。それらを使用するために、私はProgram Filesフォルダの下のどこかにあるメインのものを参照します。このライブラリは、GACにインストールされている他のライブラリを使用します。サードパーティ製アセンブリの特定のバージョンを適用します。

サードパーティ製のDLLの新しいバージョンがリリースされました。v1.2です。 Program FilesフォルダのDLLは新しいバージョンに置き換えられます。 GACでは、両方のバージョンが共存しています。

問題がv1.2がインストールされている場合、それを再コンパイルせずに、そしてapp.exe.configファイルを変更せずに、(DLLをv1.1でコンパイルされた)アプリケーションが動作するように取得することです。

私はDLLのメンテナーです。追加の制約は、DLLの最新バージョンのみがProgram Filesにインストールされ、他のDLLがすべてGACにインストールされることです(すべてのバージョンが保持されます)。

私の問題は、アプリケーションが起動しますが、最終的には私が原因のタイプの間の非互換性のエラーを取得することをされています、私は推測してい

Unhandled Exception: System.InvalidCastException: 
[A]ThirdParty.User cannot be cast to [B]ThirdParty.User. 
Type A originates from 'ThirdParty, Version=1.2.0.0, Culture=neutral, PublicKeyToken=XXXX' 
in the context 'Default' at location 'C:\Windows\Microsoft.Net\assembly\GAC_32\ThirdParty\v4.0_1.2.0.0__XXXX\ThirdParty.dll'. 
Type B originates from 'ThirdParty, Version=1.1.0.0, Culture=neutral, PublicKeyToken=XXXX' 
in the context 'Default' at location 'C:\Windows\Microsoft.Net\assembly\GAC_32\ThirdPart\v4.0_1.1.0.0__XXXX\ThirdParty.dll'. 

私はv1.2 DLLが選択されている方法を理解することを確認していないこと、パスDLLにはアプリケーションに格納されます。このアプリケーションは、このバージョンのGACでDLLを使用することを決定しますか?コンパイルに使用したシステムとは異なるシステムでテストしていますが、DLLは同じ場所にあります。 documentationからの私の理解は、v1.2ではなく、GACのv1.1バージョンを選択する必要があるということです。

私の間違いはどこですか?どうすれば修正できますか?

おかげで、

+0

かなり標準DLL地獄。 *どういうわけか*あなたがそれをターゲットにしていなくても、v1.2オブジェクトが作成されました。邪悪な行為者を見つける簡単な方法は、v1.2にアクセスできないようにし、GACからそれを削除することです。これでDLLを見つけることができなくなるので、今度は爆弾が必要になります。しかし、おそらく著者にバグレポートを送る必要があります。 –

+0

@HansPassant私はこの地獄の保守主義者です... – piwi

答えて

0

は、私は私の特定のケースで解決策を見つけた、と再読み込み私の質問に私は私の最初のDLLがPowerShellインスタンスに依存しないことには言及しなかった実現しています。私は自分の問題を取り巻く場所です。 GACに存在しているDLLあれば私のDLLには、私は特定のバージョンをロードし、そして私のPowerShellインスタンスにロード:

var assembly = Assembly.Load("ThirdParty, Version=1.1.0.0, Culture=neutral, PublicKeyToken=XXXX"); 
var ps = PowerShell.Create(); 
ps.Commands.AddCommand("Import-Module").AddParameter("-Assembly", assembly); 
ps.Invoke(); 
関連する問題