COM+ 激活库使 .Net v4 工作进程崩溃

COM+ Activation Library crashes .Net v4 worker process

有一个 .Net (v4.6) WebAPI 具有用 VB6 编写的遗留中间件。在 COM+ 应用程序中,大多数中间件是 COM DLL。 通常只有很少的用户,HTTP 请求调用任何这些 COM DLL,IIS 工作进程崩溃,现在这是不一致的。

事件日志有崩溃日志 应用程序池 'MyAppPool' 由于服务该应用程序池的进程中的一系列故障而被自动禁用。

A condition has occurred that indicates this COM+ application is in an unstable state or is not functioning correctly. Assertion Failure: m_guidLogicalThread == GUID_NULL

Server Application ID: {56C23B4E-EF46-4C46-9ABA-8CFAA386745E} Server Application Instance ID: {02DC69D6-B20F-4FB6-B1F2-B61AE32D5D51} Server Application Name: GMT_PrimeSuite The serious nature of this error has caused the process to terminate. COM+ Services Internals Information: File: com\complus\src\comsvcs\jit\jit.cpp, Line: 31 Comsvcs.dll file version: ENU 2001.12.10530.18999 shp

下面是如何创建 COM 实例并调用其方法的示例代码。

dynamic comInstance =  Activator.CreateInstance("Example.ISample");
comInstance.DoSomeWork();

经过大量调查和测试后,发现后期绑定,即运行时 COM 实例是罪魁祸首,使所有 COM DLL 直接引用嵌入了 COM 互操作类型,并将 Activator.CreateInstance 替换为类型的对象创建(早期绑定)即我们正常的 IEmployee ref = new ..... 这显着改善了 COM 的资源消耗和管理。来自提琴手的约 7000 个 HTTP 请求封装了 COM 调用,看不到 Complus 异常以及应用程序池不再崩溃。