为什么通过c#互操作获得COM+组件要花这么长时间?

本文关键字:长时间 组件 COM+ 互操作 为什么 | 更新日期: 2023-09-27 17:50:01

我使用下面的库来引用我的COM+组件:

using System;
using System.Runtime.InteropServices;
namespace ServiceLib
{
    [ClassInterface(0)]
    [Guid("9DA56255-697A-11D4-935C-00105AD43C9D")]
    [TypeLibType(2)]
    public class ServiceClass : IServiceManager, ServiceManager
    {
        public ServiceClass();
        ...
    }
}
在我的代码中,我像这样引用它:

ServiceClass serviceClass = new ServiceLib.ServiceClass();

然而,获取对象可能需要长达5分钟的时间。我的COM+组件是服务包装器,包装在windows服务周围。所以,基本上,当某些东西创建一个COM+引用时,我希望windows服务为它启动,但它没有。也没有任何.exe进程与它相关联。因此,实际上,据我所知,我的系统在5分钟内没有发生任何事情,直到上面的行返回COM+对象。

为什么通过c#互操作获得COM+组件要花这么长时间?

看起来问题是COM+组件的底层进程过早死亡,并且没有足够的时间在我的终端上捕获它(检查,使用Windows中的事件查看器)。它死亡的原因是,多个进程试图创建对它的引用,而构造函数由于多个进程试图获取它的同步问题而失败!

编辑:在一个单独的控制台应用程序,我做了测试这个问题,我创建了一个引用的组件在三个新的线程,和奇怪的时间我确实看到这个问题,这是一个已知的问题围绕COM+,涉及多个用户帐户创建太多的COM+引用。

再次编辑:在我创建任何引用之前,我通过在我的windows服务上发布一个服务启动来解决我所有的问题。

最终编辑:真正的问题是,COM+对象本身没有创建一个适当的单例,它在AtlAdvise调用上产生了一个竞争条件…上述解决方案之所以有效,是因为它确保不会产生竞争条件。通常我会去创建线程安全的代码。但是,唉,这不是我的问题,因为我使用的是别人的api。