1

ユーザーのマシンで利用可能なdllに基づいてコンポーネントを動的にロードできるように、特定のdllのメニュー項目を動的に構築するソフトウェアに取り組んでいます。ロードしたい dll には、AssemblyInfo.cs ファイルのアセンブリ属性と、その dll のメニュー項目を作成するかどうかを判断する方法でフラグが付けられています。これまでの私の方法は次のとおりです。

private void GetReportModules() {
        foreach (string fileName in Directory.GetFiles(Directory.GetCurrentDirectory())) {
            if (Path.GetExtension(fileName) == ".dll" || Path.GetExtension(fileName) == ".exe") {
                System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom(fileName);
                object[] attributes = assembly.GetCustomAttributes(typeof(ReportNameAttribute), false);
                if (attributes.Count() > 0) {
                    ReportNameAttribute reportNameAttribute = attributes[0] as ReportNameAttribute;
                    Type type = assembly.GetType(reportNameAttribute.BaseType);
                    MenuItem customReportsMenuItem = new MenuItem();
                    customReportsMenuItem.Header = reportNameAttribute.ReportName;
                    ReportsMenuItem.Items.Add(customReportsMenuItem);
                    customReportsMenuItem.Click += (s, ev) => {
                        var obj = Activator.CreateInstance(type);
                        type.InvokeMember("Show", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, obj, null);
                    };
                }
            }
        }
    }

ほとんどの場合、正常に動作し、期待している dll を取得して、メニュー項目を正常に作成しています。問題は、属性を確認するために、まずリフレクションを使用してアセンブリをロードする必要があることです。他のローカル dll のいくつかは、欠落している依存関係についてロードしようとするとエラーをスローするか、モジュールにアセンブリ マニフェストが含まれている必要があります。実際にロードする前に、アセンブリをロードできるかどうかを安全に確認する方法はありますか? (私がそれを書き出すとばかげているように聞こえます)。私がここで試していることを達成する方法について、私が直面している問題やより良い提案について何か考えはありますか? 私の頭の上に少し感じています。

4

3 に答える 3

2

1 つの方法は、try catch ブロックを利用することです。例外がスローされる場合は、興味がありません...

編集:

MSDN は、LoadFrom がスローできる例外の種類を明確に説明しています。あなたの場合、 FileLoadException は可能性が高いようです。

キャッチ後に実行されたコードがそこにあると確信しています。たとえば、ロギング フレームワーク。フレームワークが例外をキャッチして実行可能ファイルを停止させたくないなど、例外を窒息させたいと思います。ログの行が発生しなかったという理由だけでアプリケーションが失敗することはありません。

于 2012-09-25T18:23:03.407 に答える
1

代わりに、Unmanaged Metadata API (http://msdn.microsoft.com/en-us/library/ms404384.aspx) または Common Compiler Infrastructure Metadata API (http://ccimetadata.codeplex.com/) を試すことができます。単純な反射。

于 2012-09-25T19:18:57.657 に答える