2010-07-29 1 views
3

어셈블리를 Windows 서비스 (ala NServiceBus)로 호스트 할 수있는 매우 간단한 Generic Host 솔루션을 개발 중입니다. 다음 예외 (Dru의 blog post에 언급 된 주석과 유사)를 건너오고 있습니다. 다른 AppDomains에서 서비스를 호스팅 할 수 있도록이 작업이 필요합니다.ConfigureServiceInIsolation - Generic Host를 사용하여 Topshelf 서비스 실행

"형 'MyProject.WindowsServices.GenericHost.Program + <> c__DisplayClass5'총회에서 'MyProject.WindowsServices.GenericHost, 버전 = 1.0.0.0, 문화, PublicKeyToken = null이 중립 ='로 직렬화 표시되지 않습니다."

topshelf 홈페이지 (topshelf-project.com)의 다운로드 링크에서 제공되는 Topshelf 1.0 RC 바이너리를 사용하고 있습니다. 나는 최신 빌드 (29/07/2010)를 시험해 보았고, 구글 코드와 github에서 다운로드 할 수있는 빌드를 만들었다! 나는 그들 중 누구도 나를 위해 일하게 할 수 없다!

이 버전은 Topshelf의 이전 버전을 사용하는 NServiceBus 라이브러리에서 작동합니다 (dll은 버전 0.8.0.96입니다). 아래에있는 몇 가지 사소한 코드 변경 사항 (HowToBuildService 대신 CreateServiceLocator 사용)을 사용하면 이전 버전의 바이너리와 함께 사용할 수 있지만 계획된 픽스 나 향상된 기능을 활용하려면 최신 코드를 사용하는 것이 좋습니다.

여기 내 코드입니다. 노트의 또

static void Main(string[] args) 
{ 
    ArgumentParser arguments = new ArgumentParser(args); 
    string configFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, 
     arguments.ServiceType.Assembly.ManifestModule.Name + ".config"); 

    RunConfiguration cfg = RunnerConfigurator.New(x => 
    { 
     x.SetServiceName(arguments.ServiceName); 
     x.SetDisplayName(arguments.DisplayName); 
     x.SetDescription(arguments.Description); 

     if (string.IsNullOrEmpty(arguments.UserName)) 
     { 
      x.RunAsLocalSystem(); 
     } 
     else 
     { 
      x.RunAs(arguments.UserName, arguments.Password); 
     } 

     x.ConfigureServiceInIsolation<GenericHost>(c => 
     { 
      c.ConfigurationFile(configFile); 
      c.Named(arguments.ServiceType.AssemblyQualifiedName); 
      c.HowToBuildService(name => new GenericHost(arguments.ServiceType)); 
      c.WhenStarted(tc => tc.Start()); 
      c.WhenStopped(tc => tc.Stop()); 
     }); 
    }); 

    Runner.Host(cfg, args); 
} 

내 GenericHost 클래스와 arguments.ServiceType에 의해 식별 된 클래스는 모두 MarshalByRefObject를 구현하고 나는 또한 도움이 될 있는지 확인하기 위해 직렬화 이러한 클래스를 만든 것입니다. 문제를 일으키는 클래스는 아니지만, 내가 설정 한 람다 중 하나 이상에 대해 C# 컴파일러가 생성 한 익명 형식에 대해 불평하는 것으로 보입니다.

다른 사람이 ConfigureServiceInIsolation()을 사용하여이 문제가 발생합니까? 그렇지 않다면, 내가 누락 된 것을 누구라도 아는가? 추가 정보가 필요하면 알려주세요 (예 : 스택 추적 또는 더 많은 코드.

답변

0

호스트에서 서비스를 하나만 사용하는 경우 "InIsolation"이 제거됩니다. 그것은 제대로 작동하지 않지만 TopShelf의 미래 버전에서 (우리는 현재 그것에 대해 연구하고 있습니다) 나는이 문제에 대해 더 나은 대답을 가지고 있다고 생각합니다. 호스트에있는 파일을 삭제하고 새로운 AppDomain에서 서비스를 자동으로 시작하는 기능이 있습니다.

필자는이 문제가 알려진 이슈에 해당한다고 말하고 InIsolation을 사용해야하는 강력한 이유가없는 한 그 순간을 피합니다. 앱 도메인 장벽에 걸쳐 람다 식을 마샬링 할 수 없으므로 지금보고있는 문제입니다. InIsolation 문제가 중요하다면 최신 버전을 출시하기 전에 타임 라인을 수정하는 노력을 들여다 볼 수 있습니다. [최신 개발자를 확보 할 수 있습니다. 여기에서 비트 : http://github.com/legomaster/Topshelf - 경고, 우리는 여전히 적극적인 개발을 받고 있지만, 나는 모든 주요 버그가 이제 과즙이라고 생각합니다].

이 더이 문제를 논의하려면 모든 개발자가보고되는 경우, 그것은 MassTransit 목록에 게시 할 수있는 가장 쉬운 수 있습니다 : http://groups.google.com/group/masstransit-discuss

난이 도움이되기를 바랍니다!

+0

답변 해 주셔서 감사합니다. 트래비스! 향후 버전과 같은 사운드에는 일종의 일반용 호스트가 있습니다. Windows 서비스를 실행하기 위해 파일을 드롭하는 것은 매우 멋진 기능입니다. 지금은 InIsolation 부분없이 뭔가를 설정할 수 있는지 알게 될 것입니다. 서비스마다 사용자 지정 실행 파일로 다시 전환 할 수도 있습니다.이 방법은 단기적인 솔루션으로도 좋습니다. 다음 버전이 준비되었을 때 어떤 아이디어가 있습니까? – Sam

+0

내 내부 릴리스를 충족하기 위해 2010 년 10 월 출시를 목표로 삼았습니다.마감 기한이 이해 관계자들에 의해 추진 되더라도 우리는 여전히 그 일정을 맞출 것으로 기대합니다. – Travis

+0

이 모든 것이 공개되면 Udi를 사용하여 NServiceBus 메인 라인으로 가져옵니다. 따라서 Isolation없이 작동 시키면 Udi가 새로운 비트가 섞일 때까지 그냥 앉아있을 수 있습니다.하지만 그건 완전히 당신에게 달린 것입니다. 우디가 올해 우리가 제공 할 수있는 몇 가지 기능을 추가로 요구하고 있음을 알고 있습니다. – Travis