C# COMException 作为 Windows 服务,但 WinForms OK

C# COMException as Windows Service, but WinForms OK

我正在尝试用 C#(VS2010、.NET 4.0)编写一个 Windows 服务,作为一个长 运行ning OPC 客户端。根据命令行参数,它可以 运行 作为 Windows 服务,或作为带有 Start/Stop 按钮的 WinForms 应用程序来模拟服务(但更容易调试)。

我目前正在使用 Interop.OPCAutomation 调用 COM。当我 运行 作为 WinForms 应用程序时,一切都 运行 符合预期,没有错误。但是当我 运行 作为 Windows 服务时,它失败并出现以下异常:

[System.Runtime.InteropServices.COMException: "No such interface supported" 错误代码:-2147220990 在 OPCAutomation.IOPCAutoServer.Connect(字符串 ProgID,对象节点) 在 Project.Opc.Collector..ctor(String serverName, IEnumerable`1 tagNames, String machineName, Boolean asynchronous) in C:\CompanyName\Projects\Applications\Project\Project.Opc\Collector1.cs:line 41

这是有问题的代码:

_server = new OPCServer(); //this works OK

try {
    _server.Connect(serverName, machineName); // this is where it fails
} catch (Exception exc) {
    string message = string.Format("Unable to connect to OPC server {0} on {1}", serverName, machineName);
    OpcException exception = new OpcException(message, exc);
    Logger.Log(message, LogLevel.Exception, exception);
    throw exception;
}

我运行将 Windows 服务器版本设置为 SYSTEM,它不能与打开或关闭允许访问桌面一起使用。由于此代码在 WinForms 中运行良好,因此它可能不是 OPC 问题。但我不知道为什么相同的代码不能作为服务使用。

一位related article也有类似的问题,但仍未得到解答。有其他人看到 and/or 解决了这个问题吗?

服务中使用的服务帐户似乎没有 COM 组件所需的访问权限,要解决此问题,请使用管理员帐户或用于 WinForm(当前用户)的帐户。

检查与您的问题相似的 link