0

サードパーティのCOMオブジェクトと緊密に結合されたWindowsアプリケーションがあります。そして、このcomオブジェクトのインスタンスを介して、私が行っているのは、作成、削除、保存、およびエクスポートだけです。新しい要件が発生したので、別の同様のサードパーティコンポーネントを追加する必要がありますが、ベンダーは異なります。

サードパーティの依存関係が変更されたことを除いて、最初のアプリケーションと同様の別のアプリケーションを作成したくありません。

Windowsアプリケーションをどのように変更すればよいですか?

  1. これらのサードパーティの依存関係を簡単に切り替えることができます。(ゆるく結合されたようなもののように)。
  2. 別のコードをメンテナンスする必要はありません。

いくつかの指示が必要です。

4

1 に答える 1

1

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メソッドを追加できます。次に、実装クラスはそのインスタンスを格納し、メソッドを呼び出して双方向通信を配置できます。IPluginIPluginHost

于 2012-05-28T20:15:32.900 に答える