围绕单实例库编写托管对象模型

时间:2012-11-27 02:10:12

标签: c# .net

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

  1. 初始化
  2. 打开数据库
  3. 使用数据库
  4. 关闭数据库

    (重复)

  5. 我想围绕这个库提供的功能编写一个.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或类似的东西中手动加载库?

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

1 个答案:

答案 0 :(得分:1)

如果该全局状态仅在RAM中(即DLL不使用状态的硬编码文件名/注册表键),那么我看到2个选项如何使用多个实例:

  1. (quick& dirty)重命名DLL并以其他名称加载它。这可能由于许多原因而失败,例如,由于某些依赖DLL的状态或显式检查..

  2. (通常更正确,但更难)创建一个加载C DLL的EXE,并将功能公开为某些IPC API,例如:作为具有命名管道绑定的WCF服务。然后,生成该EXE进程的几个实例,并使用WCF来调用API。