2013-04-17 3 views
0

Я новичок с использованием Quartz.net, и мой вопрос следующий: я создал WCF-сервер, который включает в себя интерфейс с операциями, которые может выполнять планировщик, и класс который реализует интерфейс, в котором выделяется конструктор, который создает экземпляр планировщика и методы.Добавление инструкции сборки в службе WCF

В другом месте, внутри одного и того же проекта, я могу создать библиотеку с определением простого задания:

public class MyJob : IJob 
{ 
    public virtual void Execute(IJobExecutionContext context) 
    { 
     // Body of the job 
    } 

Все прекрасно работает при подключении с клиентом, но мне нужно, чтобы включить работу по-другому, включая .dll динамически в служебной папке кварца. Но я не знаю, как это сделать.

Я искал решение, и я нашел что-то в связи с System.Reflection; но я не знаю, где мне нужно установить возможный код.

+2

_ «Мне нужно включать задания по-другому, в том числе .dll динамически в папке с сервисом кварца» _ - можете ли вы подробно остановиться на этом? Что именно ты пытаешься сделать? – CodeCaster

+0

Спасибо за внимание. Вместо того, чтобы включать «вручную» файл Job.dll в служебную папку кварца, я хочу включить их удаленно. Затем мне нужно запланировать работу с помощью триггера, и я не знаю, что это за метод. Мой тест службы включает описание задания в библиотеке внутри проекта, а в классе удаленного сервера у меня есть метод sched.ScheduleJob (jobDetail, trigger). Но если у меня есть только Jobs.dll, я не знаю, «связать» триггер. – user2290341

+0

Например, если у меня есть список dll разных заданий, jobA.dll, jobB.dll и т. Д., Внутри папки службы кварца, я хотел бы знать, как я могу сказать планировщику, что я хочу график для экзамена на работуA с помощью triggerA. – user2290341

ответ

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); 
+0

Спасибо за ваш ответ. Но где я могу разместить эти строки? В колдовской части, по методу ScheduleJob? – user2290341

+0

@ user2290341 thats в целом, о том, как загружать сборки и типы путем отражения, ваша конкретная реализация зависит от вас и вашей работы, не так ли? –

+0

Да, вот и все! – user2290341

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); 

Но, когда я использую мой клиент, чтобы выполнить этот метод, я получаю следующее исключение:

--Object ссылка не указывает на экземпляр object--

Спасибо очень мучо за ваш предыдущий ответы!

Смежные вопросы