gpt4 book ai didi

c - 支持具有全局数据的插件 DLL 的多个实例

转载 作者:可可西里 更新时间:2023-11-01 13:16:53 26 4
gpt4 key购买 nike

上下文:我将遗留的独立引擎转换为组合工具的插件组件。从技术上讲,这意味着我将引擎代码库编译为 C DLL,我使用 P/Invoke 从 .NET 包装器调用它;包装器实现由组合工具定义的接口(interface)。这工作得很好,但现在我收到了为不同项目加载引擎的多个实例的请求。由于引擎将项目数据保存在一组全局变量中,并且由于带有引擎代码库的 DLL 仅加载一次,加载多个项目意味着项目数据被覆盖。

我可以看到很多解决方案,但它们都有一些缺点:

  1. 您可以使用相同的代码创建多个 DLL,Windows 将它们视为不同的 DLL,因此它们的代码不会共享。如果您有多个不同名称的引擎 DLL 副本,这可能已经有效。但是,引擎是使用 DllImport 属性从包装器调用的,我认为在编译包装器时需要知道引擎 DLL 的名称。显然,如果我必须为每个项目编译不同版本的包装器,这是相当麻烦的。

  2. 引擎可以作为一个单独的进程运行。这意味着包装器会在加载项目时为引擎启动一个单独的进程,并且会使用某种形式的 IPC 与该进程进行通信。虽然这是一个相对干净的解决方案,但它需要一些努力才能开始工作,我现在不知道哪种 IPC 技术最适合建立这种结构。还可能存在显着的通信开销:引擎需要频繁交换 float 数组。

  3. 该引擎可以进行调整以支持多个项目。这意味着应该将全局变量放入项目结构中,并且对全局变量的每个引用都应该转换为与特定项目相关的相应引用。大约有 20-30 个全局变量,但正如您可以想象的那样,这些全局变量在整个代码库中都被引用,因此这种转换需要以某种自动方式完成。一个相关的问题是您应该能够在所有地方引用“当前”项目结构,但是将其作为额外参数传递到每个函数签名中也很麻烦。是否存在一种技术(在 C 中)来考虑当前调用堆栈并在其中找到相关数据值的最近封闭实例?

stackoverflow 社区能否就这些(或其他)解决方案提供一些建议?

最佳答案

将整个该死的东西放在一个 C++ 类中,然后对变量的引用将自动找到实例变量。

您可以创建一个指向事件实例的全局指针。这应该是线程本地的(参见 __declspec(thread))。

添加 extern "C" 包装函数,委托(delegate)给事件实例上的相应成员函数。提供创建新实例、拆卸现有实例和设置事件实例的功能。

OpenGL 使用这种范式取得了很好的效果(参见 wglMakeCurrent),无需实际将状态指针传递给每个函数即可找到其状态数据。

关于c - 支持具有全局数据的插件 DLL 的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4645558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com