Я разрабатываю очень простое решение Generic Host, которое позволит нам размещать сборки в качестве служб Windows (аля NServiceBus).Я сталкиваюсь со следующим исключением (похоже на комментарии, упомянутые в блоге Дру ).Мне нужно, чтобы это работало, чтобы я мог размещать службы в разных доменах приложений.
"Тип" MyProject.WindowsServices.GenericHost.Program + <> c__DisplayClass5 'в сборке "MyProject.WindowsServices.GenericHost, Version = 1.0.0.0, Culture= нейтральный, PublicKeyToken = null 'не помечен как сериализуемый. "
Я использую двоичные файлы Topshelf 1.0 RC, доступные по ссылке для скачивания на домашней странице topshelf (topshelf-project.com).Я попробовал последнюю сборку (29/07/2010), и сборки доступны для загрузки из кода Google и GitHub!Я не могу заставить никого из них работать на меня!
Это работает в библиотеке NServiceBus с более старой версией Topshelf (dll имеет версию 0.8.0.96).С некоторыми незначительными изменениями кода в том, что у меня есть ниже (используйте CreateServiceLocator вместо HowToBuildService), он работает для меня с этими более старыми двоичными файлами, но я бы предпочел придерживаться новейшего кода, чтобы воспользоваться преимуществами любых запланированных исправлений или улучшений.
Вот мой код.
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, и я также сделал эти классы Serializable, чтобы увидеть, поможет ли это,Однако не эти классы вызывают проблему, а жалуются на анонимный тип, сгенерированный компилятором C # для одной или нескольких лямбда-конфигураций, которые я настроил.
Кто-нибудь еще сталкивался с этой проблемой при использованииConfigureServiceInIsolation ()?Если нет, кто-нибудь знает, что мне здесь не хватает?Дайте мне знать, если вам нужна дополнительная информация, например, трассировка стека или больше кода.