2012-07-03 22 views
5

Me gustaría crear una configuración para mi servicio de Windows. Los dlls de mi servicio de Windows se colocan en la carpeta/Lib /.Instalar el servicio .net windows con la carpeta lib

Agregué una clase de instalador al servicio. Y agregó una acción personalizada en el proyecto de instalación.

El problema es que cuando intento instalar el servicio - falla con el error: error 1001. No se puede obtener tipos de instalación en ...

Este error ocurre porque los archivos DLL no están en la misma directorio como el servicio .exe. estoy usando sondeo en la configuración del servicio e instalar util no reconoce que el sondeo ..

quería encontrar un trabajo en torno a ese problema y tryed de muchas maneras para crear el servicio utilizando controlador de servicio (sc. exe). Intenta ejecutarlo como una acción personalizada con cmd.exe. Etc ..

Esto debería ser un problema común ... ¿Alguien ha encontrado una solución adecuada para eso?

Respuesta

0

Debe vincularse al evento AppDomain.AssemblyResolve y realizar su carga personalizada en el controlador de eventos.

Se puede encontrar un ejemplo en la primera respuesta al this SO question.

+0

Actualmente estoy usando simplemente la unión config .. Es por eso que Instalar util no reconoce los archivos DLL .. El servicio se ejecuta cuando uso Sc.exe .. Simplemente no se ejecuta usando installutil, – Lee

+0

@Lior: Acabo de recuperar mi respuesta porque creo que funcionará. InstallUtil tendrá que cargar su ensamblado en el CLR, en cuyo momento se generará el evento 'AppDomain.AssemblyResolve' para todas sus dependencias. Por favor inténtalo. Tiene sentido (al menos para mí). –

2

que he tenido el mismo problema, y ​​ninguna de las opciones propuestas en este post o MSDN ayudado. Me imaginé otra solución:

Mediante el uso de reflector en InstallUtil.exe, descubrí que InstallUtil es simplemente un contenedor delgada para llamar System.Configuration.Install.ManagedInstallerClass.InstallHelper(args) dentro de un bloque try/catch (que también establece la cultura interfaz de usuario del hilo actual y muestra los derechos de autor) ManagedInstallerClass.InstallHelper en sí reside en el ensamblado System.Configuration.Install.dll, accesible para todos. Por lo tanto, simplemente modifiqué el método Program.Main de mi servicio para permitir la instalación. Ver el código rápido y sucio-abajo:

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); 
     } 
    } 
} 

Usted puede hacer lo mismo, o crear su propia versión de InstallUtil.

+0

Esta es una buena solución y funcionó para mí. Cuando el cargador de ensamblaje se ejecuta en el contexto de la aplicación, puede encontrar sus propios ensambles utilizando probePath, a diferencia de InstallUtil.exe, que no respeta el exe.config –

Cuestiones relacionadas