使用lib文件夹安装.net Windows服务

时间:2012-07-03 14:27:00

标签: c# windows-services

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,本帖或MSDN中提出的选项都没有帮助。我想出了另一个解决方案:

通过在InstallUtil.exe上使用Reflector,我发现 InstallUtil只是一个在try / catch块中调用System.Configuration.Install.ManagedInstallerClass.InstallHelper(args) 的瘦包装器(它还设置了当前线程' 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版本。

答案 1 :(得分:0)

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

可以在this SO question的第一个答案中找到样本。

答案 2 :(得分:0)

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