6

IPluginModel私たちのコードは、メイン プログラムで定義されている定義済みの構造に準拠する dll をリモートでロードする「プラグイン」モデルを使用します。メイン プログラム自体にはいくつかのローカライズされたフォームがあり、UI 内のテキストとラベルの配置はすべて、異なるローカライズに基づいて変更されていThread.CurrentThread.CurrentUICultureます。

私たちが気づいたことの 1 つは、リモートでロードされた dll からのフォームまたはレポートが適切にローカライズされないことです。プラグインのさまざまなリソースを含むローカリゼーション dll が、メイン フォームの隣、プラグイン dll の隣、またはその他の場所のどこにあるかは問題ではないようです。メイン プログラムの実行時にアセンブリ自体が読み込まれるときに、アセンブリがローカライズされたリソースを正しく見つけるにはどうすればよいでしょうか。

Hereで使用されるメソッドにかなり似たコードがありますが、可能であれば、フォーム自体に対して resx を手動で実装する必要はありません。私が持っているコードはプラグイン自体の中に直接あり、CurrentUICulture が「en-US」でないときはいつでも呼び出されます。

理想的に言えば、私が探しているのは、ロードしたpluginName.resources.dllばかりのプラグインに直接関連付けられている をロードする方法です。メイン プロジェクトの bin フォルダーにさまざまなフォルダーが表示されますmain.resources.dll。es フォルダーには .その時の私のやり方が悪かったのかもしれません…

アセンブリの読み込み [コード スニペット]

    private void LoadPlugin(string filePath)
    {
        bool isValidPlugin = false;
        Assembly asm = null;
        try
        {
            asm = Assembly.LoadFrom(Path.Combine(Environment.CurrentDirectory, filePath));
                //Do some type checking to make certain this is in fact one of OUR plugins
            var p = (IFTLPlugin)Activator.CreateInstance(types[x]);
                _plugins.Add(p.Prefix, p);
            }
        }

編集:この件に関するその他の考え

サテライト アセンブリ、実装できるイベント、またはオーバーライドできる関数を解決しようとする読み込み構造をインターセプトする方法はありますか?コードを手動で正しいリソース アセンブリに向けることができますか? アセンブリの解決に関するいくつかのことを見つけましたが、それはサテライト リソースではなく、直接読み込みに関するものでした。

4

2 に答える 2

2

すでによくご存じのとおり、ランタイムは規則に従って、サテライト アセンブリ (例: fr/pluginName.resources.dll) を探して、ローカライズされたリソースを読み込みます。

この問題は、これらのサテライト アセンブリが見つからないことが原因であると考えるのが正しいと思います。.NET Framework 診断ツールfuslogvw.exeを使用して、これを確認してみてください。また、サテライト アセンブリをグローバル アセンブリ キャッシュ (GAC) に配置することもできます (このページの「グローバル アセンブリ キャッシュへのサテライト アセンブリのインストール」を参照)。

それが機能する場合、および他の適切な場所 (GAC 以外) を見つけやすくするために、サテライト アセンブリを探すためにランタイムによって検査される場所が、フォールバック プロセスとして次の場所に文書化されています: http://msdn.microsoft.com/en-米国/図書館/sb6a8618%28v=vs.71%29.aspx

于 2012-11-07T10:57:09.513 に答える
0

質問の背景で指摘したように、.NETシステムは、リソースアセンブリをロードするときに、Thread.CurrentThread.CurrentUICultureを使用します。

問題は、別の方法で指示されるまで、新しいスレッドがデフォルトでCultureInfo.InstalledCultureになることです。

メインコードに、初期化呼び出しで目的のカルチャをライブラリに渡してもらいます。

次に、リソースをロードする前に、ライブラリにThread.CurrentThread.CurrentUICulture(および必要に応じて.CurrentCulture )を設定してもらいます。これは、たとえば、InitializeComponent()またはTryFindResource()を呼び出す前になります。

これにより、OSのアイデアに関係なく、ライブラリのスレッドのカルチャがメインプログラムのスレッドのカルチャと一致します。

于 2012-11-07T05:13:05.070 に答える