从Windows服务运行基于COM的c#控制台应用程序(c#)

时间:2017-02-02 14:23:26

标签: c# windows service com

我遇到了通过c#代码从Windows服务应用程序运行c#控制台应用程序的问题。

我使用Windows服务作为后台工作程序,每个时间间隔运行一个任务(Quartz库)。

这是运行其他c#console app的作业代码

ps = new ProcessStartInfo(batchRunnerPath);
ps.UseShellExecute = false;
ps.CreateNoWindow = true;
ps.RedirectStandardError = true;
ps.RedirectStandardOutput = true;
ps.Verb = "runas";
var process = Process.Start(ps);
string error = process.StandardError.ReadToEnd();
process.WaitForExit();

控制台应用程序正在使用COM对象,它会呈现PDF和图像,但这很重要。

当我运行控制台应用程序exe文件manualy它完美的工作,但当我尝试从这个工作程序运行它我得到一个异常

System.Runtime.InteropServices.COMException (0x80080005): Retrieving the COM class factory for component with CLSID {22FBECF5-10A3-11D2-9194-204C4F4F5020} failed due to the following error: 80080005 Server execution failed (Exception from HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE)).
   at System.Runtime.Remoting.RemotingServices.AllocateUninitializedObject(RuntimeType objectType)
   at System.Runtime.Remoting.Activation.ActivationServices.CreateInstance(RuntimeType serverType)
   at System.Runtime.Remoting.Activation.ActivationServices.IsCurrentContextOK(RuntimeType serverType, Object[] props, Boolean bNewObj)
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Activator.CreateInstance(Type type)
   at JDA.Intactix.Automation.SpacePlanning..ctor(Boolean bIKSBRVMenuParam)
   at ReportRunner.Program.Main(String[] args) in E:\CFT\PgRunner\BatchRunner\Program.cs:line 98

从我看到这个工作者正在启动这个控制台应用程序(因为我在控制台应用程序中使用log4net记录一些信息)但在第98行,我创建了新的COM对象,它给出了错误。

继承人我是如何运行Windows服务的 enter image description here

并且是一个给出了arror的代码 - line = new SpacePlaning(false)给出了arror

      SpacePlanning sp = null;
        ProSpace.Project currentProject = null;
        ProSpace.PrintSetup printSetup = null;

        var plnLogic = Container.Resolve<Strategix.sCentralPlugin.SPPlugin.SPLogic.IPlanogramLogic>();

        try
        {
            sp = new SpacePlanning(false);

1 个答案:

答案 0 :(得分:0)

  

HRESULT异常:0x80080005(CO_E_SERVER_EXEC_FAILURE))

可能来自您想要使用的COM组件的未定义的安全/身份配置。您需要足够的权限才能从Windows服务(权限管理)实例化COM组件。

  • 启动DCOMCNFG.exe,组件服务 - &gt;计算机 - &gt;我的电脑 - &gt; DCOM配置 - &gt; [您的COM组件]
  • 右键单击,属性

选中“安全”标签和“身份”标签配置。