COM组件100%来自控制台应用程序,但在从服务调用时失败

时间:2010-12-11 00:13:23

标签: c# .net windows-7 windows-services

我需要您对以下C#代码的建议:

EgarDDSEnt.IIVDDSEnt dds = null; // This line executes fine.
dds = new IVDDSEnt();  // This line fails with an exception ...
dds.Connect("username", "password"); // ... which makes this line fail too.

以下是症状:

Windows Server 2008 R1:

  • 从Windows服务应用程序执行时代码失败。
  • 从控制台应用程序执行时,代码可以100%运行。

Windows 7:

  • 从Windows服务应用程序执行时,代码可以100%运行。
  • 从控制台应用程序执行时,代码可以100%运行。

IVDDSEnt()类是安装“ivolatility SDK”时安装的COM对象。

更新

  • 当我从控制台应用程序执行“System.IO.Directory.GetCurrentDirectory()”时,它返回“D:\ MyDevDirectory \”
  • 当我从服务应用程序执行“System.IO.Directory.GetCurrentDirectory()”时,它返回“C:\ windows \ system32 \”。
  • 该应用程序实际上是服务和控制台的相同的二进制(它是一个可以在控制台模式下运行的混合应用程序,或者如果您将“-service”传递给它,则将其自身安装为服务命令行)。

更新

添加了try / catch和“e.GetBaseException”(定义为“返回异常,这是一个或多个后续异常的根本原因”):

System.Runtime.InteropServices.COMException (0x80080005): Retrieving
the COM class factory for component with CLSID
{FA944FE7-AEB8-4B5B-8315-11D19B1F6264} failed due to the following error:
80080005 Server execution failed (Exception from HRESULT:
0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
at PhiDataOnSchedule.ConsoleApplication.MyMain(Boolean dummyRun)

更新

仍然无法解决问题 - 最简单的方法可能是从Windows Server 2008 R1升级到Windows Server 2008 R2(如果它适用于Win7,而Windows Server 2008 R2有Win7核心,也许它会以某种方式解决潜在问题?)。

3 个答案:

答案 0 :(得分:4)

这可能是权利问题。检查服务运行的服务帐户及其权限。然后更改服务帐户或扩展其权限。

答案 1 :(得分:1)

CO_E_SERVER_EXEC_FAILURE是“服务器执行失败”。

这表明组件应该处于进程外,但COM运行时无法启动可执行文件(或者,可能会将dll加载到主机进程中)。

查找包含Process Monitor组件的文件的活动可能会给你一个线索(可能是权限:Process Monitor可以确认这一点)。

答案 2 :(得分:0)

也许我必须指定一个帐户来运行服务?

有关如何编写代码的完整示例,请参阅:

http://www.codeproject.com/KB/WPF/LtoE.aspx?artkw=LINQ%20to%20WCF#ShowIt

搜索文本:“运行安装程序后,将允许您使用以下对话框输入要在其下运行的服务登录凭据”:

alt text