我是使用Quartz.net的新手,我的问题如下:我创建了一个WCF服务器,其中包含一个接口,其中包含调度程序可以执行的操作,以及一个实现接口的类被分配了实例化调度程序和方法的构造函数。
在其他地方,在同一个项目中,我可以创建一个包含简单作业定义的库:
public class MyJob : IJob
{
public virtual void Execute(IJobExecutionContext context)
{
// Body of the job
}
当我与客户端连接时,一切正常,但我需要以不同的方式包含作业,包括动态地在石英服务文件夹中的.dll
。但我不知道怎么做。
我一直在寻找解决方案,而且我找到了与System.Reflection
有关的内容;但我不知道我必须在哪里找到可能的代码
答案 0 :(得分:0)
您似乎需要从.dll文件动态加载程序集,这可以通过反射来完成。
var assembly = Assembly.LoadFile(@"yourDllFilesPath.dll"); // this loads the assembly
现在,您可以获得此汇编类
var type = assembly.GetType("Foo"); // a class Foo
现在你有类型,你仍然需要创建这种类型的实例,这可以使用Activator
object obj=Activator.CreateInstance(type);
答案 1 :(得分:0)
我有像这样的典型ScheduleJob方法
public void ScheduleJob(string jobName, string groupName, string triggerName, string cron, bool a)
{
// Load the assembly
AssemblyName assembly = AssemblyName.GetAssemblyName(@"C:\Program Files\Quartz.net\Jobs2.dll");
System.Reflection.Assembly obj = System.Reflection.Assembly.Load(assembly);
Type type = obj.GetType("MyJob2");
if (!(type is IJob))
{
// Nothing, because the Job only have one method from IJob
}
// Contructor
ConstructorInfo ctor = type.GetConstructor(new Type[] { });
object loadedObject = ctor.Invoke(new object[] { obj });
IJob importedObject = (IJob)loadedObject;
JobKey jobKey = new JobKey(jobName, groupName);
IJobDetail jobDetail = JobBuilder.Create(importedObject.GetType())
.WithIdentity(jobName, groupName)
.Build();
TriggerKey tkey = new TriggerKey(triggerName, groupName);
ITrigger cronTrigger = TriggerBuilder.Create()
.WithIdentity(tkey)
.ForJob(jobDetail)
.WithCronSchedule(cron)
.Build();
AddJob(jobName, groupName, a);
GetScheduler().ScheduleJob(cronTrigger);
但是,当我使用我的客户端执行此方法时,我收到以下异常:
- 对象引用未设置为对象的实例 -
非常感谢你以前的答案!