WPFコンテナーアプリケーション(ContentControl
ホスト付き)とコンテナーアプリケーション(UserControl
)があります。どちらもお互いに気づいていません。
dllpath
包含対象のDLLの文字列と包含対象内の完全な名前空間名を保持するXML構成ファイルは1つだけViewModelClass
です。
コンテナ内のジェネリックコードは、コンテナのアセンブリ(Assembly.LoadFrom(dllpath)
)を解決し、を使用してビューモデルのインスタンスを作成しますActivator.CreateInstance(vmType)
。これviewmodel
がコンテナ内でホストされ、ContentControl
関連するvierwmodel固有のResourceDictionaryがContentControl.Resources.MergedDictionaries
コンテナのコンテンツコントロールに追加されると、ビューが正常に読み込まれます。
これで、包含者は、ローカルフォルダーからのDataGrid
アセンブリ参照を使用してWPFをホストする必要があります。WPFToolkit.dll
C:\Lib
へのローカルコピー参照は、包含者のプロジェクトのファイルにWPFToolkit.dll
追加され、XAML名前空間を使用してのみ参照されます。このようにして、containeeアプリケーションのフォルダがコピーされます。.csproj
UserControl.XAML
bin\debug
WPFToolkit.dll
XAML:
xmlns:Controls="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
<Controls:DataGrid ItemsSource="{Binding AssetList}" ... />
問題:(ViewModel
つまり、被収容者のユーザーコントロールが)自分自身を読み込もうとした
瞬間に、このエラーが発生します。
「タイプ'Microsoft.Windows.Controls.DataGrid'が見つかりません。コンパイル時に使用されるアセンブリが、ロード時に使用されるアセンブリと異なる可能性があり、タイプがありません。」
myAssembly.GetReferencedAssemblies()
したがって、ビューモデルがホストされる前に、包含者のアセンブリ()の参照されたアセンブリをロードしようとしました。しかしWPFToolkit
、そのアセンブリのリストにはありません!
奇妙なことLogger.dll
に、containeeコードベースで参照されている別のdllがありますが、これはC#コードビハインドを使用して実装されています。だから私はその参照をで正しく解決しmyAssembly.GetReferencedAssemblies()
ます。
つまり、アセンブリのBAML参照は決して解決できないということGetReferencedAssemblies
ですか?
編集:
追加するのを忘れました。containeeでビルド後のイベントを実行して、すべてbin\debug\*.*
をコンテナーの「bin\debug」にxcopyしました。それで動作します。しかし、私はすべての被収容者がそのようにコンテナにコピーされることを望んでいません。コンテナは、実行時まで、コンテナアプリケーション(dllであっても)を認識しないようにする必要があります。