【发布时间】:2013-02-27 22:05:59
【问题描述】:
我希望了解运行 COM DLL 时出现的一些意外行为,其中静态 C++ 数据似乎在多个进程之间共享。环境有点复杂,我对各种 COM 线程模型的理解也比较薄弱,希望有人能提供帮助。
环境
- 在 64 位操作系统上运行多个 C# Web 服务的 IIS 服务器,每个服务在其自己的 32 位应用程序池中,因此进程
- 池具有“启用 32 位应用程序”=True 设置
- 每个 32 位 C# 服务调用不同的进程内 32 位 COM DLL(因此服务 A 调用 COM DLL 1,服务 C 调用 COM DLL 2。COM DLL 是使用 Qt 4.8 ActiveQt 用 C++ 编写的
- COM DLL 依赖于许多共享的 32 位 C++ DLL,即 COM DLL 1 和 2 都依赖于 Utilities.dll
- 据我所知,没有为 COM DLL 设置 ThreadingModel,因此我预计系统将退回到主 STA。
- 我知道这是不受欢迎的,但我目前没有足够的知识来更改它。
- Utilities.dll 包含一些静态 C++ 数据
- COM DLL 是使用“regsvr32”注册的,并且似乎没有列在“组件服务”中,尽管我对后者的了解很少。
观察到的问题是 Utilities.dll 中的静态数据似乎最终在不同的 IIS 进程之间共享,从而产生了不良后果。我曾预计,由于 COM 位于主 STA 中,它们将被访问,就好像它不是线程安全的一样,每个进程都会获得自己的 DLL 静态数据副本,但情况似乎并非如此。
有人能解释一下静态数据是如何在进程之间共享的吗?
我怎样才能避免这种情况? (除了重构代码以删除所有静态数据,这目前并不可行)
【问题讨论】:
-
组件服务中是否安装了 COM dll?
-
COM dll 是否在代理进程中运行?使用 Process Explorer 检查 - 搜索 Utilities.dll 并查看它在哪里。
标签: c# c++ windows com process