2013-04-17 4 views
0

나는 Quartz.net을 사용하는 초심자이며 나의 질문은 다음과 같다 : 나는 스케줄러가 할 수있는 연산과 인터페이스를 포함하는 WCF 서버를 만들었고 클래스 스케줄러와 메소드를 인스턴스화하는 생성자가 할당 된 인터페이스를 구현합니다. 다른 장소에서WCF 서비스에서 어셈블리 명령어 추가하기

, 같은 프로젝트의 내부에, 나는 간단한 작업의 정의와 라이브러리를 생성 할 수 있습니다 : 나는 클라이언트와 연결할 때

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

모두 잘 작동하지만 나는 작업을 포함해야 쿼츠 (quartz) 서비스 폴더에 동적으로 .dll을 포함하여 다른 방법으로. 하지만 어떻게해야할지 모르겠다.

나는 해결책을 찾고 있는데, 나는 System.Reflection과 관련하여 뭔가를 발견했다. 하지만 내가 가능한 코드를 어디에 위치시켜야하는지 모르겠다.

+2

_ "석영 서비스 폴더에 동적으로 .dll을 포함하여 다른 방법으로 작업을 포함해야합니다"_ -이 작업을 자세히 설명 할 수 있습니까? 너 정확히 뭘 하려구? – CodeCaster

+0

감사합니다. Job.dll을 석영 서비스 폴더에 "수동으로"포함하는 대신 원격으로 포함하려고합니다. 그럼, 그걸로 방아쇠를 당기는 일을 스케쥴해야하고, 그 일을하는 방법이 뭔지 모르겠다. 내 서비스 테스트에는 프로젝트 내부의 라이브러리에 대한 작업 설명이 포함되어 있으며 원격 서버 클래스에는 sched.ScheduleJob (jobDetail, trigger) 메서드가 있습니다. 하지만 제가 Jobs.dll 만 가지고 있다면 트리거를 "연관 시키십시오". – user2290341

+0

예를 들어, quartz 서비스 폴더 안에 jobA.dll, jobB.dll 등 다른 작업의 dll 목록이있는 경우 원하는 스케줄러에 어떻게 말 할 수 있는지 알고 싶습니다. triggerA로 jobA를 examplo하기위한 일정. – 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 일반적으로 리플렉션을 사용하여 어셈블리 및 유형을로드하는 방법에 대한 구체적인 구현 방법은 귀하와 귀하의 업무에 달려 있습니다. 그렇습니까? –

+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 참조는 이전 당신에게 매우 하니까요 감사 답변!

관련 문제