6

我想为我的 Windows 服务创建一个设置。我的 windows 服务的 dll 放在 /Lib/ 文件夹中。

我在服务中添加了一个安装程序类。并在设置项目上添加了自定义操作。

问题是当我尝试安装该服务时 - 它失败并出现错误:错误 1001。无法获取安装程序类型...

发生此错误是因为 dll 与服务 .exe 不在同一目录中。我在服务配置中使用探测并且安装工具无法识别探测..

我想找到解决该问题的方法,并尝试以多种方式使用服务控制器(sc.exe)创建服务。尝试使用 cmd.exe 将其作为自定义操作运行。ETC..

这应该是一个常见问题..有人找到合适的解决方案吗?

4

3 回答 3

2

我遇到了同样的问题,这篇文章或 MSDN 中建议的选项都没有帮助。我想出了另一个解决方案:

通过在 InstallUtil.exe 上使用 Reflector,我发现InstallUtil 只是一个用于System.Configuration.Install.ManagedInstallerClass.InstallHelper(args)在 try/catch 块内调用的瘦包装器(它还设置当前线程的 UI 文化并显示版权)。ManagedInstallerClass.InstallHelper它本身位于 System.Configuration.Install.dll 程序集中,每个人都可以访问。因此,我只是修改了Program.Main我的服务方法以允许安装。请参阅下面的快速和肮脏的代码:

static class Program
{
    static void Main(string[] args)
    {
        if (args != null && args.Any(arg => arg == "/i" || arg == "/u"))
        {
            // Install or Uninstall the service (mimic InstallUtil.exe)
            System.Configuration.Install.ManagedInstallerClass.InstallHelper(args);
        }
        else
        {
            // Run the service
            System.ServiceProcess.ServiceBase[] ServicesToRun;
            ServicesToRun = new System.ServiceProcess.ServiceBase[] 
            { 
                new MyService() 
            };
            System.ServiceProcess.ServiceBase.Run(ServicesToRun);
        }
    }
}

您可以这样做,或创建您自己的 InstallUtil 版本。

于 2014-03-25T13:11:38.187 回答
0

在您的配置中,您可以添加探测路径 - 它提示运行时在哪里寻找程序集 http://msdn.microsoft.com/en-us/library/823z9h8w%28v=vs.80%29.aspx

于 2012-07-03T15:15:00.893 回答
0

您应该绑定到AppDomain.AssemblyResolve事件并在事件处理程序中进行自定义加载。

可以在这个 SO question的第一个答案中找到一个示例。

于 2012-07-03T14:43:36.640 回答