3

今日は、チェーン内の追加のアセンブリを参照する C# WPF でプロジェクトを構成する方法を知りたいと思います。「チェーン内」とは、次のようなことを意味します。

  • アセンブリプラグインを参照するアプリケーションがあります
  • プラグイン アセンブリは、プラグインによって使用されるリソースが配置されているリソースを参照します。画像
  • メイン アプリケーションはリソースをまったく参照しません。

次の図は、私が今言ったことを示しています。
チェーン参照アセンブリ

問題は、リソースがアプリケーションの bin フォルダーにコピーされず、必要なプラグイン (画像の Ctrl) リソースの検出に失敗することです。

回避策

メイン アプリケーションの参照にリソースを含めるか、ビルド後の手順を使用してその手順で必要なファイルを手動でコピーするだけの回避策があります。

結論

最後に、その問題にどのように対処していますか。回避策のセクションで述べた以外の解決策はありますか? プロジェクトの構成に何か不足していますか?

4

2 に答える 2

1

プラグイン プロジェクト プロパティの出力ディレクトリが、アプリケーションの出力ディレクトリと同じであることを確認してください。それ以外の場合は、ファイルを自分でコピーする必要があります。

2 番目のオプションは、埋め込みリソースを使用することです。

于 2012-08-17T13:42:31.920 に答える
0

プラグインを EXE とは別のフォルダーから動的にロードする場合、その依存関係をプラグインと同じフォルダーにコピーして、それらのアセンブリを動的にロードすることもできます。次に、AssemblyResolve を処理して、新しいアセンブリを見つけようとする代わりに、既に読み込まれているアセンブリを解決する必要があります。

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
    private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        var domain = (AppDomain)sender;
        var assemblies = domain.GetAssemblies();
        return assemblies.FirstOrDefault(assembly => assembly.GetName().Name == args.Name.Split(',')[0]);
    }

上記のコードは、バージョンと厳密な名前を区別しない一致を行います。より厳密なものが必要な場合は、ここで独自のポリシーを実装できます。

于 2012-08-17T13:54:44.440 に答える