2

プラグインシステムをC#で実装しようとしています。そのために、次のクラスとインターフェイスを作成しました。

ローダーとプラグインの両方に含まれています:

interface IDevicePlugin {
    string GetName();
    string GetVersion();
}

プラグインコード(.dllにコンパイル)

public class DummyPlugin : IDevicePlugin {
        protected string name;
        protected string version;

        public string GetName() {
            return name;
        }
        public string GetVersion() {
            return version;
        }
  }

プラグインをロードするコードは次のとおりです。

IDevicePlugin thePlugin;
Assembly plugin = Assembly.LoadFrom("plugin.dll");

foreach (Type pluginType in plugin.GetTypes()) {
       if (pluginType.IsPublic && !pluginType.IsAbstract) {
            Type typeInterface = pluginType.GetInterface("IDevicePlugin", true);
            if (typeInterface != null) {
                 // the plugin implements our IDevicePlugin interface
                 thePlugin =  (IDevicePlugin)Activator.
                         CreateInstance(plugin.GetType(pluginType.ToString()));
            }
       }
}

そして、これは次のようにクラッシュします:

Unable to cast object of type 'PluginTest.DummyPlugin' to type 'PluginTest.IDevicePlugin'.
4

1 に答える 1

8

インターフェースは 2 回存在
します: plugin.dll に 1 回、ローダーに 1 回です。
これは、プラグイン プロジェクトへのインターフェイス定義を含む *.cs ファイルへの参照 (=リンク) を追加したためです。さらに、同じ *.cs ファイルがローダー プロジェクトの一部です。
そのため、インターフェイスは両方のアセンブリにコンパイルされます。これらは、名前が同じであっても、2 つの異なるインターフェイスです。

この問題を解決するには、次の手順を実行する必要があります。

ローダープロジェクトの参照をプラグイン プロジェクトに追加します。
または
、インターフェース用の新しいプロジェクトを作成し、ローダー プロジェクトとプラグイン プロジェクトの両方からこのプロジェクトを参照します。

于 2012-08-31T12:46:46.283 に答える