我有一个应用程序,其核心功能包含在(C)DLL中。此库的导出存在头文件。这个应用程序非常单实例化。我的意思是,库内部使用了很多全局状态,因为它只能一次处理一个文件。应用程序与此库一起使用的正常工作流程如下:
关闭数据库
(重复)
我想围绕这个库提供的功能编写一个.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
或类似的东西中手动加载库?
我真的只预见一次需要一个实例,但不必忍受这种限制就好了。
答案 0 :(得分:1)
如果该全局状态仅在RAM中(即DLL不使用状态的硬编码文件名/注册表键),那么我看到2个选项如何使用多个实例:
(quick& dirty)重命名DLL并以其他名称加载它。这可能由于许多原因而失败,例如,由于某些依赖DLL的状态或显式检查..
(通常更正确,但更难)创建一个加载C DLL的EXE,并将功能公开为某些IPC API,例如:作为具有命名管道绑定的WCF服务。然后,生成该EXE进程的几个实例,并使用WCF来调用API。