无法注册COM对象以在计划任务中使用

时间:2017-11-30 22:32:06

标签: c# windows com windows-10 registry

我正在尝试创建一组可以安排在将来运行的C#类。目的是通过我的代码的其他部分以编程方式安排这些。

这是我试图通过COM调用的当前类。

using System;
using System.Linq;
using System.Runtime.InteropServices;
using Microsoft.Win32.TaskScheduler;

namespace SchedulableTasks
{
    [Guid("F5CAE94C-BCC7-4304-BEFB-FE1E5D56309A")]
    public class TaskRegistry : ITaskHandler
    {
        private ITaskHandler _taskHandler;
        public void Start(object pHandlerServices, string data)
        {
            var arguments = data.Split('|');
            var taskTypeName = arguments.FirstOrDefault();
            var taskArguments = arguments.Skip(1).FirstOrDefault();
            var taskType = Type.GetType(taskTypeName);
            _taskHandler = (ITaskHandler) Activator.CreateInstance(taskType);
            _taskHandler.Start(pHandlerServices, taskArguments);
        }

        public void Stop(out int pRetCode)
        {
            var retCode = 1;
            _taskHandler?.Stop(out retCode);
            pRetCode = retCode;
        }

        public void Pause()
        {
            _taskHandler.Pause();
        }

        public void Resume()
        {
            _taskHandler.Resume();
        }
    }
}

以下是我尝试安排任务的方法

using System;
using Microsoft.Win32.TaskScheduler;
using Newtonsoft.Json;
using Action = Microsoft.Win32.TaskScheduler.Action;

namespace MyProject.Service
{
    public static class SchedulingService
    {
        public enum ScheduledTask
        {
            BillingQuery
        }
        private static readonly Guid RegistryGUI = new Guid("F5CAE94C-BCC7-4304-BEFB-FE1E5D56309A");
        public static void ScheduleAction(string name, string description, Trigger trigger, Action action)
        {
            using (var taskService = new TaskService())
            {
                var task = taskService.NewTask();
                task.RegistrationInfo.Description = description;
                task.Triggers.Add(trigger);
                task.Actions.Add(action);
                taskService.RootFolder.RegisterTaskDefinition(name, task);
            }
        }

        public static Action CreateCSharpAction(ScheduledTask task, object data)
        {
            var taskData = $"{task.ToString()}|{JsonConvert.SerializeObject(data)}";
            return new ComHandlerAction(RegistryGUI, taskData);
        }
    }
}

Microsoft.Win32.TaskSchedulerthis library

的2.7.2版

我可以创建计划任务没问题,但是当我尝试运行它时,我得到一个Class not registered (0x80040154)

在我的.csproj中,我将程序集注册为COM对象。 对于PlatformTarget属性,我使用相应的AnyCPU尝试了所有x86x64regasm.exe

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <RegisterForComInterop>true</RegisterForComInterop>
    <PlatformTarget>x86</PlatformTarget>
  </PropertyGroup>

我正在使用以下post-build事件来注册.dll。

powershell C:\Windows\Microsoft.Net\Framework64\v4*\RegAsm.exe /codebase '$(ProjectDir)$(OutDir)SchedulableTasks.dll'

尽我所知,它已正确注册。 Registry Screenshot

Procmon.exe似乎报告相同。我担心的是\TreatAs\InprocHandler\InprocServer32\InprocServer32的“未找到名称” Procmon Screenshot

1 个答案:

答案 0 :(得分:1)

我想我看到了你的问题:

  

&lt; PropertyGroup Condition =&#34; &#39; $(配置)| $(平台)&#39; ==&#39;调试| AnyCPU &#39; &#34;&GT;

尝试定位x86。有关详细说明,请参阅此答案:How to solve COM Exception Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))?

修改

我无法重复它,我添加了一些东西:

  1. 属性[ComVisible(true)]
  2. 无参数构造函数
  3. 签署大会
  4. 必须手动运行powershell命令。
  5. enter image description here