1

レポート モジュールの使用をサポートするいくつかのソフトウェアに取り組んでいます。基本的に、デフォルトですべてのレポートを出荷したくありません。不必要な膨張を作成するだけなので、実行時に動的に追加できる有効なモジュールの現在のexeとdllをチェックする効率的な方法を探しています。これまでのところ、AssemblyInfo でカスタム属性を設定して実験し、次のようにフラグとして使用しました。

private void GetReportModules() { 
        try {
            var dlls = Directory.GetFiles(Directory.GetCurrentDirectory()).Where(x => Path.GetExtension(x) == ".dll" || Path.GetExtension(x) == ".exe");
            dlls = dlls.OrderBy(x => Path.GetFullPath(x)).Where(x => {
                try {
                    return null != System.Reflection.Assembly.LoadFrom(x);
                } catch (Exception) {
                    Console.WriteLine("Skipping {0} - does not load using reflection.", Path.GetFileName(x));
                    return false;
                }
            });

            foreach (var dll in dlls) {
                System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(dll);
                object[] attributes = assembly.GetCustomAttributes(typeof(ReportNameAttribute), false);
                if (attributes.Count() > 0) {
                    // dynamically include the assembly as a menu item
                }
            }

        } catch (Exception ex) { throw new GenericException(ex); }
    }

問題は、文字通りすべての dll と exe を 2 回ロードする必要があることです。これはあまり効率的ではないようです。以前にこれと同様のことを達成した方法や、私がやっていることを改善する方法を誰かが提案できますか?

最初にアセンブリをロードしなくても属性を確認できたら、本当に素晴らしいことです。

4

1 に答える 1

2

リフレクションにはコストがかかります。通常、一度実行すればそれほど高価ではありません(結果をキャッシュすることを忘れないでください。時々更新する必要がある場合は、タイマーを使用できます)。

すべてのアセンブリをロードしてチェックしたくない場合は、ユーザーがロードするものを明示的に定義する必要がある構成ファイルを使用できます。

また、定義により、このことに関連する dll のみを含む特別なフォルダーを設定することもできます。このフォルダー内のものはすべて、ロードしたいものになります。

于 2012-09-26T20:41:52.550 に答える