2013-02-25 271 views
2

我正在一个项目中使用几个C++和几个C#组件。我目前正在研究一个新的C#组件,它需要与C++组件共享数据(未来可能会有更多组件访问这个组件)。所有组件都在相同的进程中运行。我目前的想法是使用内存数据库,但我不确定是否可能。使用内存中的SQLite数据库在C++和C#之间共享数据?

SQLite很受欢迎,可用于C++和C#项目,并且它具有内存中功能。问题是,如果可以从这两个组件访问同一个数据库,我可以使用C++项目中用C++创建的db(指针)的句柄吗?

回答

3

是的,那是可能的。当然,你需要共享一些数据结构和句柄(如你所说)。这样SQLite无法检测到托管代码和本地代码之间的区别。因此,行为不会有任何差异。

如果您只是使用PInvoke或C++/CLI来交换数据结构,可能会更容易。为了在进程中传递数据而抛开一个完整的SQL数据库看起来很浪费。

+0

使用数据库的想法来自未来(可能)使用(创建,修改)相同数据的更多组件的可能性。有了数据库,我不必编写代码来处理这个问题。把它放在内存中似乎是一个好主意,因为一旦应用程序关闭,数据就会过时,应用程序就不需要打扰文件系统。至于性能方面,系统中的网络通信始终是瓶颈,相比之下,数据库将是次要的。你还觉得这是浪费的方法吗? – 2013-02-25 14:53:57

+0

根据你提出的观点,这是完全合理的。剩下的唯一问题就是:什么方法尽可能做一点工作?我仍然怀疑内存数据库的编程工作比少数使用众所周知的数据结构的PInvoke调用要少。但如果数据适合这种存储,这是一个好主意。 – usr 2013-02-25 15:02:38

0

是的,你可以。 sqlite数据库在内存中,但它作为文件驻留在磁盘上。当你关闭数据库连接时,它将被刷新到磁盘上的文件中。所以你基本上可以在一个组件写入时打开数据库连接并关闭连接,以便其他组件可以读取/写入数据库。它与您操作文件的方式很相似,只不过它在内存中管理,而不是在磁盘上管理,所以比文件快一点。但如果你的意图是在C++和c#之间的IPC,还有其他更好的方法。

+1

SQLite内存数据库(':memory:')没有文件。 – 2013-02-25 14:50:11