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