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 异常以及应用程序池不再崩溃。
有一个 .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 异常以及应用程序池不再崩溃。