加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 04:36:29 所属栏目:Windows 来源:网络整理
导读:上下文:我将旧版独立引擎转换为组合工具的插件组件.从技术上讲,这意味着我将引擎代码库编译为C DLL,我使用P / Invoke从.NET包装器调用它;包装器实现由组合工具定义的接口.这非常有效,但现在我收到了为不同项目加载多个引擎实例的请求.由于引擎将项目数据保
上下文:我将旧版独立引擎转换为组合工具的插件组件.从技术上讲,这意味着我将引擎代码库编译为C DLL,我使用P / Invoke从.NET包装器调用它;包装器实现由组合工具定义的接口.这非常有效,但现在我收到了为不同项目加载多个引擎实例的请求.由于引擎将项目数据保存在一组全局变量中,并且由于具有引擎代码库的DLL仅加载一次,因此加载多个项目意味着项目数据被覆盖.

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

>您可以使用相同的代码创建多个DLL,这些代码被Windows视为不同的DLL,因此不会共享其代码.如果你有不同名称的引擎DLL的多个副本,这可能已经有效.但是,使用DllImport属性从包装器调用引擎,我认为在编译包装器时需要知道引擎DLL的名称.显然,如果我必须为每个项目编译不同版本的包装器,这非常麻烦.
>引擎可以作为一个单独的进程运行.这意味着包装器在加载项目时会为引擎启动一个单独的进程,并且它将使用某种形式的IPC与此进程进行通信.虽然这是一个相对干净的解决方案,但它需要一些努力才能开始工作,我现在不知道哪种IPC技术最适合建立这种结构.通信也可能存在很大的开销:引擎需要经常交换浮点数组.
>该引擎可以适应多个项目.这意味着全局变量应该放入项目结构中,并且对全局变量的每个引用都应该转换为相对于特定项目的相应引用.大约有20-30个全局变量,但是可以想象,这些全局变量是从整个代码库引用的,因此需要以某种自动方式完成此转换.一个相关的问题是你应该能够在所有地方引用“当前”项目结构,但是在每个函数签名中作为额外参数传递它也很麻烦.是否存在一种技术(在C中)来考虑当前的调用堆栈并在那里找到最近的相关数据值的封闭实例?

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

把整个darn的东西放在C类中,然后对变量的引用会自动找到实例变量.

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

添加extern“C”包装函数,该函数委托给活动实例上的相应成员函数.提供创建新实例,拆除现有实例和设置活动实例的功能.

OpenGL使用这个范例产生了很大的效果(参见wglMakeCurrent),找到它的状态数据而不必实际向每个函数传递状态指针.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读