ユーザーのマシンで利用可能な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 のいくつかは、欠落している依存関係についてロードしようとするとエラーをスローするか、モジュールにアセンブリ マニフェストが含まれている必要があります。実際にロードする前に、アセンブリをロードできるかどうかを安全に確認する方法はありますか? (私がそれを書き出すとばかげているように聞こえます)。私がここで試していることを達成する方法について、私が直面している問題やより良い提案について何か考えはありますか? 私の頭の上に少し感じています。