为什么通过C#interop获取COM +组件需要这么长时间?

时间:2014-03-12 13:45:58

标签: c# service interop com+

我使用以下引用我的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 +对象为止。

1 个答案:

答案 0 :(得分:0)

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

编辑:在我测试问题的单独控制台应用程序中,我在三个新线程中创建了对该组件的引用,并the odd time I do see this issue that is a known problem around COM+, related to multiple user accounts creating too many COM+ references

再次编辑:我设法通过在托管COM +对象的Windows服务上发出服务启动来解决我的所有问题,然后创建任何对它的引用。

最终编辑:真正的问题是COM +对象没有创建自己的正确单例并且它在AtlAdvise调用上产生竞争条件......上面的解决方案有效,因为它确保不会产生竞争条件。通常我会创建线程安全代码。但是,唉,这不是我的问题,因为我正在使用别人的API。