1

WPFコンテナーアプリケーション(ContentControlホスト付き)とコンテナーアプリケーション(UserControl)があります。どちらもお互いに気づいていません。

dllpath包含対象のDLLの文字列と包含対象内の完全な名前空間名を保持するXML構成ファイルは1つだけViewModelClassです。

コンテナ内のジェネリックコードは、コンテナのアセンブリ(Assembly.LoadFrom(dllpath))を解決し、を使用してビューモデルのインスタンスを作成しますActivator.CreateInstance(vmType)。これviewmodelがコンテナ内でホストされ、ContentControl関連するvierwmodel固有のResourceDictionaryがContentControl.Resources.MergedDictionariesコンテナのコンテンツコントロールに追加されると、ビューが正常に読み込まれます。

これで、包含者は、ローカルフォルダーからのDataGridアセンブリ参照を使用してWPFをホストする必要があります。WPFToolkit.dllC:\Lib

へのローカルコピー参照は、包含者のプロジェクトのファイルにWPFToolkit.dll追加され、XAML名前空間を使用してのみ参照されます。このようにして、containeeアプリケーションのフォルダがコピーされます。.csprojUserControl.XAMLbin\debugWPFToolkit.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であっても)を認識しないようにする必要があります。

4

1 に答える 1

0

AppDomain.AssemblyResolve問題の解決策は、イベントにハンドラーを追加することかもしれません。このイベントは、アセンブリが必要であり、アプリケーションが通常の方法で見つからない場合の最後の手段と呼ばれます。これは、必要なものを見つけようとして、containeesフォルダーをスキャンすることでこのプロセスをカスタマイズできる場所です(構成から読み取られるため、ハードな関係はありません)dll

于 2012-10-15T11:42:52.493 に答える