我有 Windows 服务,它尝试使用以下代码创建和使用 OLE 对象(即 - Matlab 通过自动化):
var type = Type.GetTypeFromProgID("matlab.application");
var matlab = Activator.CreateInstance(type);
在我的机器上一切正常(Win7 x64,单用户),但在生产服务器(Win 2008 R2 Datacenter SP1)上我有问题。如果我像往常一样启动服务 exe 文件(我有这种可能性),它可以在那里工作,但是如果我尝试将它作为服务启动,它会返回异常:
System.Runtime.InteropServices.COMException (0x80080005):检索具有 CLSID {AC62BA4E-6ED9-4F33-9967-B260419E5EAD} 的组件的 COM 类工厂失败,原因是以下错误:80080005 服务器执行失败(来自 HRESULT 的异常:0x80080005 (CO_E_SERVER_EXEC_FAILURE ))。
我试过了:
- 在系统/管理员/另一个用户帐户下启动服务
- 使用 dcomcnfg 实用程序检查配置(它实际上有帮助,我有另一个错误,但现在授予“matlab.automation”dcom 对象的所有权限)
- 在调用“Activator.CreateInstance”后,内存中有 Matlab.exe 进程,但它只是挂起..
那么 - 我如何使用 Windows 服务中的 Matlab 自动化对象?
非常感谢!
更新
可能会有所帮助 - 生产服务器是 Amazon EC2 实例,因此它也有终端服务器。也许这可能是个问题?因为我之前遇到过互斥锁的问题,通过创建全局互斥锁解决了。
更新 2
异常总是在 120 秒内发生(确切地说),所以看起来 OLE 客户端没有看到 CoRegisterClassObjects 的调用,或者可能没有任何其他调用。在任何情况下 - 调用 Activator.CreateInstance 和异常之间的延迟正好是 120 秒。