0

コア機能が(C)DLLに含まれているアプリケーションがあります。このライブラリのエクスポート用のヘッダーファイルが存在します。このアプリケーションは非常に単一インスタンスです。つまり、ライブラリは一度に1つのファイルでのみ機能することを目的としているため、内部で多くのグローバル状態を使用します。アプリケーションがこのライブラリで使用する通常のワークフローは次のとおりです。

  1. 初期化

  2. データベースを開く

  3. データベースを操作する

  4. データベースを閉じる

    (繰り返す)

このライブラリが提供する機能を中心に.NETオブジェクトモデルを作成したいと思います。つまり、「データベース」をオブジェクト(呼び出し)にしたいということです。このオブジェクトDatabaseには、ライブラリ呼び出しに要約されるプロパティ/メソッドがあります。

Databaseもちろん、いつでも複数のオブジェクトを使用できるようにしたいと思います。ただし、このライブラリのインスタンスが1つロードされている可能性があり(私は推測します)、ライブラリによるグローバル変数の使用によって制限されます。

私のオプションは何ですか?


最上位クラスDatabaseにファクトリメソッドを介してのみアクセスできるようにすることを検討しました。これにより、のインスタンスの数がDatabase1つだけに制限されます。

public class Database {
    private Database() {
       library_init();
       // ...
    }

    private Database m_instance;

    public static Database Open(string file) {
         if (m_instance != null)
             throw new InvalidOperationException("...");
         return new Database();
    }

    public Close() {
        library_close();
        // ...
        m_instance = null;
    }
}

ライブラリを別の場所に手動でロードするなど、他にできることはありますAppDomainか?

私は実際には一度に1つのインスタンスが必要になると予測していますが、その制限に耐える必要がないのは素晴らしいことです。

4

1 に答える 1

1

そのグローバル ステートが RAM のみにある場合 (つまり、DLL がハードコードされたファイル名/レジストリ キーをステートに使用しない場合)、複数のインスタンスを使用する方法が 2 つあります。

  1. (クイック & ダーティ) DLL の名前を変更し、別の名前でロードします。これは、いくつかの依存 DLL の状態や明示的なチェックなど、さまざまな理由で失敗する可能性があります。

  2. (一般的にはより正確ですが、より困難です) C DLL をロードする EXE を作成し、機能を IPC API として公開します。たとえば、名前付きパイプ バインディングを使用した WCF サービスとして公開します。次に、その EXE プロセスのインスタンスをいくつか生成し、WCF を使用して API を呼び出します。

于 2012-11-27T02:29:10.227 に答える