1つのオプション(適切でない場合があります)は、すべてのプラグインが継承するインターフェイスを作成することです。このインターフェイスには、各COM.dllから実現する必要のある抽象化されたメソッドが含まれています。次に、各プラグインはインターフェイスを実装するC#クラスライブラリであり、すべての呼び出しをバックエンドCOMオブジェクトに渡します。
これは、3つの新しいDLLを出荷することを意味します。1つはインターフェイスを含み(メインアプリケーションと.NETクラスライブラリによって参照されます)、.NETクラスライブラリをメインの「プラグイン」として、次にバックエンドCOMを含みます。 dllも。
私が言ったように、それはそれを行うための1つの方法にすぎませんが、オーバーヘッドIMOをほとんど使用せずに、非常に迅速に稼働させることができます。
単純な例:
IPlugin.cs [IPlugin.dll]
interface IPlugin
{
bool MethodReturningTrue();
}
YourPlugin.cs [YourPlugin.dll、IPlugin.dllを参照]
class YourPlugin : IPlugin
{
public bool MethodReturningTrue()
{
return true;
}
}
PluginHost.cs [yourapp.exe、IPlugin.dllを参照]
class PluginHost
{
public static IPlugin GetPlugin()
{
Assembly asmbly = Assembly.LoadFrom("YourPlugin.dll");
Type objectType = asmbly.GetType("YourPlugin");
return (IPlugin)Activator.CreateInstance(objectType);
}
}
PluginUser.cs [yourapp.exe、IPlugin.dllを参照]
class PluginUser
{
public bool GetTrueValueFromPlugin()
{
IPlugin pluginObj = PluginHost.GetPlugin();
pluginObj.MethodReturningTrue();
}
}
もちろん、これは「YourPlugin.dll」内の「YourPlugin」と呼ばれるクラスに依存しています。複数の.dllをサポートする実稼働環境では、.dllを列挙し、各アセンブリをロードし、Reflectionを使用して、IPlugin
インターフェイスを実装するアセンブリ内のクラスを検索します。プラグインとホスト間の双方向通信が必要な場合は、別のインターフェース(つまり、)を作成し、のインスタンスを受け入れるIPluginHost
メソッドを追加できます。次に、実装クラスはそのインスタンスを格納し、メソッドを呼び出して双方向通信を配置できます。IPlugin
IPluginHost