隔离 COM 的清单中 clrClass 的数量限制

Limit on number of clrClass'es in manifests for Isolated COM

我们有一个庞大的计划。大约 250 个 DLL。其中,我们有大约 45 个 COM DLL 和 20 多个 .NET 程序集,其中包含 ComVisible 类。

现在我们要处理 XCopy 可部署版本...这意味着我们需要使用 Isolated COM。我一直在尝试较小的项目,并了解其工作原理的基本机制。

现在的问题是,在为一个应用程序构建清单后,它不会加载。我使用了 sxsTrace,它给出了一条无用的错误消息。

sxstrace 日志的最后四行:

INFO: Parsing Manifest File c:\src\v13\Debug-Win32\sta_net_DMModel.DLL.
  INFO: Manifest Definition Identity is sta_net_DMModel,processorArchitecture="x86",version="1.0.0.0".
ERROR: Activation Context generation failed.
End Activation Context Generation.

唯一有用的是它试图加载的最后一个 DLL 清单的名称。这是一个 .NET 程序集,里面有一堆 ComVisible 类,在启动时不需要。我从清单中注释掉了它,然后加载了程序。但是,当我查看它时,我注意到它在 DLL 的清单中有将近 500 个 clrClass 定义。我有另一个 DLL,大约有这个数字的三分之一。我在我的应用程序清单中重新包含了原始 DLL,但在应用程序清单中注释掉了 ~170 clrClass DLL。当我这样做时,应用程序加载成功。

因此,在我看来,可以从 Isolated COM 的清单中加载的 clrClass 类型信息的最大数量存在某种限制。这似乎是一个累积的事情,因为如果我注释掉任何一个 DLL,它就会加载。但是如果我把两个都留在里面,那么它就不会加载。

清单加载程序可以处理的类型信息量是否有记录限制?

是否有我可以更改的注册表设置,或者我可以添加到我的清单中以提高限制的一些常量?我不知道限制是什么,但似乎有一个。

运行 depends.exe 给出:

Error: The Side-by-Side configuration information for "c:\src\v13\debug-win32\STATIST.EXE" contains errors. The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log or use the command-line sxstrace.exe tool for more detail (14001). 

我终于找到问题了。并不是清单中的 clrClass 太多了。我使用 ProcMon 和 PerfView 来尝试查看问题,但它们并没有显示太多。

最后,我只是开始编辑清单并从清单中删除和取消删除 clrClass 条目,直到发现问题为止。我有点做了二进制搜索...删除一半,看看它是否消失了。如果没有删除另一半,看看问题是否消失。然后重复问题部分并继续减半,直到找到有问题的 clrClass(或 clrClasses)。

长话短说,我发现我遇到问题的两个 DLL 中的两个不同的 clrClass 具有相同的 CLSID。清单加载程序出错,因为在具有重复 CLSID 的两个 DLL 中存在 COM 可见 classes。在某个地方,有人在复制和粘贴等方面犯了错误。但是,来自 sxstrace 实用程序的错误消息没有具体说明错误是什么。它只是给出了一般错误。为了进行三重检查,我编写了一个实用程序来检查两个库中所有 COM 可见 classes 的 CLSID、ProgID 和 class 名称。我最终发现有3个CLSID是重复的。

因此,如果以后有人看过这个,他们会发现 .NET 程序集中的 clrClass 声明中重复的 CLSID(或 ProgID?)可能是他们的问题。