わかりました、これは本当にイライラします。XAML リソースをロードするために WPF によって生成されたコードが厳密な名前を使用していないように見えるため、WPF アセンブリのサイド バイ サイド バージョンをサポートする必要があるシナリオでは問題になる可能性があることに以前気付きました。
これは事実であることが判明し、現在問題を引き起こしています-バージョン番号(アセンブリバージョン)のみが異なるプラグインのサイドバイサイドインストールをサポートするプラグインシステムがあります。厳密に名前が付けられていて、異なる公開/秘密キーまたは異なるアセンブリ バージョン番号を持っている場合、同じ DLL ファイル名を持っていても、アセンブリは異なる ID を持つと判断されるため、これはもちろん .NET でサポートできます。
ここで、Visual Studio によってウィンドウとユーザー コントロール用に生成されたコードを見ると、自動生成されたファイルに次のように表示されます。
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/Sensormatic.AMK1000.Panel;component/views/servicepanelui.xaml", System.UriKind.Relative);
#line 1 "..\..\..\Views\ServicePanelUI.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
リソース ロケーターが作成される行に注意してください。これは、厳密な名前または xaml リソースを含むアセンブリのバージョンを指定しない相対 URI を使用しています。
LoadComponent が呼び出し元のアセンブリの ID を確認し、その公開キーとバージョンの詳細を使用するか、「this」パラメーターの型を含むアセンブリの ID を確認する可能性があると思いました。
これは当てはまらないようです。バージョン番号が異なる (ただしファイル名は同じ) 2 つのアセンブリがある場合、「リソース X が見つかりません」というメッセージとともに IOException が発生する可能性があります (上記の例では、「リソース 'views/servicepanelui が見つかりません」 .xaml'.
さらに悪いことに、これは、ファイル名が同じで公開/秘密キーが異なる、つまり異なる発行元からのアセンブリでも、このエラーが発生することを意味すると確信しています。
それで、誰もこれを回避する方法を知っていますか?WPF の厳密な名前に準拠する方法。
私に関する限り、これは WPF のバグです。これを回避するためだけに Appdomain 分離を使用する必要はありません。