我正在尝试创建一组可以安排在将来运行的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.TaskScheduler
是this library
我可以创建计划任务没问题,但是当我尝试运行它时,我得到一个Class not registered (0x80040154)
。
在我的.csproj中,我将程序集注册为COM对象。
对于PlatformTarget
属性,我使用相应的AnyCPU
尝试了所有x86
,x64
和regasm.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'
Procmon.exe似乎报告相同。我担心的是\TreatAs
,\InprocHandler
和\InprocServer32\InprocServer32
的“未找到名称”
答案 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))?
修改强>
我无法重复它,我添加了一些东西: