私はこのようなコードを使用して特定のインターフェイスを実装するタイプのためのアセンブリをスキャンしようとしている:Assembly.GetTypes()を呼び出すときにReflectionTypeLoadExceptionを防ぐ方法
public List<Type> FindTypesImplementing<T>(string assemblyPath)
{
var matchingTypes = new List<Type>();
var asm = Assembly.LoadFrom(assemblyPath);
foreach (var t in asm.GetTypes())
{
if (typeof(T).IsAssignableFrom(t))
matchingTypes.Add(t);
}
return matchingTypes;
}
私の問題は、私はReflectionTypeLoadException
を得ることであり、場合によってはasm.GetTypes()
を呼び出すと、例えばアセンブリに現在使用できないアセンブリを参照する型が含まれている場合
私の場合は、問題の原因となるタイプには興味がありません。私が探している型には、使用できないアセンブリは必要ありません。
問題は、例外を引き起こすタイプをスキップ/無視しても、アセンブリに含まれる他のタイプを処理することができますか?
あなたが探しているものよりもはるかに多くの書き換えがありますが、MEFは同様の機能を提供します。各クラスに、実装するインタフェースを指定する[Export]タグを付けてください。その後、その時点で興味のあるインタフェースだけをインポートできます。 –
@Drew、ご意見ありがとうございます。私はMEFの使用について考えていましたが、もう少し安価なソリューションがあるかどうかを見たいと思っていました。 – M4N
プラグインクラスファクトリによく知られた名前を付けるだけで、Activator.CreateInstance()を直接使用することができます。これは簡単な回避策です。それでもアセンブリの解決の問題のためにこの例外が発生した場合は、おそらく後でそれを取得するでしょう。 –