将控制台应用程序转换为Windows服务

5
我有一个使用SignalR的控制台应用程序。现在我想将其转换为Windows服务应用程序。
我只需将Main方法替换为:
static void Main()
{
    var servicesToRun = new ServiceBase[] 
    { 
        new MyService() 
    };
    ServiceBase.Run(servicesToRun);
}

并添加了一个服务类,它很简单:
namespace Services
{
    partial class MyService : ServiceBase
    {
        IDisposable SignalR { get; set; }

        public MyService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            const string url = "https://localhost:8080";
            using (SignalR = WebApp.Start<Startup>(url))
            {
                          //TODO: Add Logging
            }
        }

        protected override void OnStop()
        {
            SignalR.Dispose();
        }
          }
}

但是,现在当我尝试运行安装程序时,出现以下错误信息:

初始化安装程序时发生异常: System.BadImageFormatException: 无法加载文件或程序集 'file:///C:\Code \MyCode\Services\bin\Debug\MyService.exe' 或 其中一个依赖项。 尝试使用不正确格式的程序加载程序。

是否有简单的方法来调试此消息?还是有人知道我可能错过了什么?

我已经使用并推荐使用https://github.com/Topshelf/Topshelf。 - kenny
2个回答

3
您是如何运行安装程序的?我猜测您可能正在使用64位安装程序注册32位编译的应用程序,或者反之亦然。
换句话说,您正在运行:
%windir%\Microsoft.NET\Framework\v4.0.30319\installutil.exe <My x64 DLL/EXE>

或者:

%windir%\Microsoft.NET\Framework64\v4.0.30319\installutil.exe <My x86 DLL/EXE>

我实际上要去 %projDirectory%\bin\Debug 目录并运行 installutil.exe。但是从这两个目录尝试仍然存在相同的问题。 - Frank Johnson
不要只输入installutil.exe,使用我回答中的路径强制使用正确的一个。一个会成功,一个会失败。 - Allan Elder
抱歉。它成功了。我错误地输入了其中一个目录。谢谢! - Frank Johnson

0

您错过了在服务中创建安装程序的步骤。 在设计视图中,右键单击您的服务并选择添加安装程序或类似选项(我的VS是西班牙语)。 这将向项目添加一个新组件ProjectInstaller,其中包含两个组件serviceProcessInstaller1serviceInstaller1。在这些组件中,您必须分配一些属性来配置安装的行为,例如服务帐户、名称、描述等。 然后,您可以运行installutil.exe进行安装,否则installutil不会执行任何操作。


当我遇到这个问题时,已经安装了该程序。解决方案在被接受的答案中找到。 - Frank Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接