繁体   English   中英

使用ConfigureServiceInIsolation - Generic Host运行Topshelf服务

[英]Running Topshelf service using ConfigureServiceInIsolation - Generic Host

我正在开发一个非常简单的通用主机解决方案,它允许我们将程序集作为Windows服务托管(ala NServiceBus)。 我遇到了以下异常(类似于Dru的博客文章中提到的评论)。 我需要这个工作,所以我可以在不同的AppDomain中托管服务。

“在程序集'MyProject.WindowsServices.GenericHost中输入'MyProject.WindowsServices.GenericHost.Program + <> c__DisplayClass5',Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'未标记为可序列化。”

我正在使用Topshelf主页(topshelf-project.com)上的下载链接提供的Topshelf 1.0 RC二进制文件。 我已经尝试了最新版本(29/07/2010),以及可从谷歌代码和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#编译器为我配置的一个或多个lambda生成的匿名类型。

是否有其他人使用ConfigureServiceInIsolation()看到此问题? 如果没有,有谁知道我在这里缺少什么? 如果您需要更多信息,请告诉我,例如堆栈跟踪或更多代码。

如果您只在主机内使用一项服务,我会删除“InIsolation”。 它不能正常工作,但在TopShelf的未来版本中(我们正在研究它)我认为我们有更好的答案来解决这个问题。 除了能够在主机中删除文件并在新的AppDomain中自动启动服务之外。

我会说这属于一个已知问题,除非有令人信服的理由使用InIsolation暂时避开它。 您无法跨应用程序域障碍编组lambda表达式,因此您遇到的问题。 如果InIsolation问题非常重要,我可以在计划发布最新版本之前研究解决这个问题与时间表的关系。 [你可以抓住最新的开发者。 来自这里的位: http//github.com/legomaster/Topshelf-警告,我们仍在积极开发中,但我认为所有主要的错误现在都被压扁了]。

如果您想进一步讨论这个问题,最简单的方法是在所有开发人员都在观看的MassTransit列表中发帖: http ://groups.google.com/group/masstransit-discuss

我希望这有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM