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