Я разрабатываю очень простое решение Generic Host, которое позволит нам размещать сборки как службы Windows (ala NServiceBus). Я сталкиваюсь со следующим исключением (похожим на комментарии, упомянутые в Dru's сообщение в блоге). Мне нужно, чтобы это работало, чтобы я мог размещать службы в разных доменах приложений.
«Введите« 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, и я также сделал эти классы сериализуемыми, чтобы посмотреть, поможет ли это. Проблема заключается не в этих классах. Похоже, он жалуется на анонимный тип, сгенерированный компилятором C # для одного или нескольких настроенных мною лямбда-выражений.
Кто-нибудь еще видит эту проблему с использованием ConfigureServiceInIsolation ()? Если нет, то кто-нибудь знает, что мне здесь не хватает? Дайте мне знать, если вам понадобится дополнительная информация, например трассировка стека или другой код.