アプリケーションに単純なプラグインアーキテクチャを実装しています。プラグインの要件は、アプリケーションとプラグインによって参照される* .dllにあるインターフェイス(IPlugin)を使用して定義されます。アプリケーションにはプラグインマネージャー(同じ* .dll内)があり、プラグインフォルダー内のすべての* .dllを検索してプラグインをロードし、プラグインがインターフェイスを実装していることを確認します。私はこれを2つの異なる方法でチェックしました[以前は単純なif(プラグインはIPlugin)でした]が、プラグインがインターフェースを実装するタイミングをどちらも認識しません。コードは次のとおりです。
Assembly pluginAssembly = Assembly.LoadFrom(currFile.FullName);
if (pluginAssembly != null)
{
foreach (Type currType in pluginAssembly.GetTypes())
{
if (currType.GetInterfaces().Contains(typeof(IPlugin)))
{
// Code here is never executing
// even when the currType derives from IPlugin
}
}
}
以前は特定のクラス名(「プラグイン」)をテストしていましたが、アセンブリ内のすべてのクラスを循環させても無駄になりました。(これは、他の場所で見つけた例に従います。)これをもう少し複雑にするために、それぞれが元のインターフェイス(IPluginA、IPluginB)を実装する2つのインターフェイスがあります。プラグインは実際には、より具体的なインターフェースの1つ(IPluginB)を実装します。ただし、より一般的なインターフェイス(IPlugin)を実装するだけのプラグインで試してみましたが、それでも機能しません。
[編集:最初に受け取った2つの応答への応答]はい、IsAssignableFromを使用してみました。以下を参照してください。
Assembly pluginAssembly = Assembly.LoadFrom(currFile.FullName);
if (pluginAssembly != null)
{
foreach (Type currType in pluginAssembly.GetTypes())
{
if (typeof(IPlugin).IsAssignableFrom(currType))
{
string test = "test";
}
}
}