0

我有一个应用程序,其核心功能包含在 (C) DLL 中。此库的导出存在头文件。这个应用程序是非常单实例的。我的意思是,该库在内部使用了很多全局状态,因为它一次只能处理一个文件。应用程序与此库一起使用的正常工作流程是这样的:

  1. 在里面

  2. 打开数据库

  3. 使用数据库

  4. 关闭数据库

    (重复)

我想围绕这个库提供的功能编写一个 .NET 对象模型。通过这个,我的意思是我希望“数据库”成为一个对象(调用它Database),它具有归结为库调用的属性/方法。

我当然希望能够Database在任何给定时间拥有多个对象。但是,可以将这个库的一个实例加载到我的进程中(我假设),然后我会受到库对全局变量的使用的限制。

我有哪些选择?


我考虑让我的顶级类Database只能通过工厂方法访问,这会将实例的数量限制为Database一个:

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或类似的东西?

我真的只预见一次需要一个实例,但不必忍受这种限制会很好。

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 回答