2009-07-31 12 views
7

Creé una aplicación de consola usando C# que hace referencia a archivos DLL externos. Cuando lo ejecuto en mi máquina de desarrollo, todo funciona bien. En la máquina de producción, recibo un error de "tipo de iniciación". Al analizar esto, parece que puede ser porque la aplicación no puede encontrar los archivos DLL a los que se hace referencia.¿Cómo una aplicación de consola .NET busca conjuntos referenciados?

En mi cuadro de desarrollo, los archivos DLL a los que se hace referencia están en el GAC, pero no en el de producción. Al eliminar las DLL del GAC en el cuadro dev, ocurre el mismo error (a menos que lo ejecute desde una compilación local de Visual Studio en modo de depuración).

Estoy más familiarizado con las configuraciones del sitio web, y sé que las DLL pueden colocarse en el directorio bin o en el GAC para que la aplicación web las pueda encontrar. Pero no estoy seguro de cómo funciona esto para las aplicaciones de consola.

Soy reacio a poner el archivo DLL en el GAC en el cuadro de producción, ya que solo es necesario para esta pequeña aplicación. ¿Hay otras formas en que puedo implementar la aplicación de la consola y hacer que encuentre los ensamblajes necesarios?

Aquí es la excepción que estoy recibiendo:

de error 1 El tipo o espacio de nombres 'Entrada' no se pudo encontrar (que son falta una directiva using o una referencia de ensamblado?) C: \ documentos y Settings \ Hacker \ Mis documentos \ Visual Studio 2005 \ Projects \ básica \ básica \ Program.cs 10 8 básica

Respuesta

11

la respuesta más simple es poner la DLL en el mismo directorio que la aplicación de consola y los encontrará.

La respuesta más larga es bastante compleja ya que hay muchos factores que influyen en cómo y dónde el CLR busca los ensambles a los que se hace referencia. Los animo a echar un vistazo al siguiente artículo de MSDN que detalla cómo funciona esto.

0

Al examinar la excepción que te dan (y puede que tenga que sumergirse en la excepción interna), debería ver un registro de todos los lugares buscado (el "registro de fusión") .

Recomendaría simplemente colocar los archivos DLL dependientes en el mismo directorio que la aplicación de la consola.

+0

En realidad, solo tiene que mostrar 'ex.ToString()'. –

2

El GAC (Global Assembly Cache) registra su .dll para que no tenga que tenerlos en el directorio de trabajo de su aplicación. Todos los .dll de .NET (System.IO.dll, System.dll, etc.) se registran a través del GAC, lo que significa que no es necesario que los tenga en el directorio de la aplicación. De forma predeterminada, si un .dll no está registrado en el GAC, entonces el programa buscará en su propio directorio el archivo .dll que falta.

Por lo tanto, usted tiene tres opciones:

  1. añadir su .dll que se hace referencia en la GAC, o
  2. añadir su referencia.DLL en el directorio de trabajo de su aplicación
  3. Ir a sus referencias en la solución/proyecto y seleccione Propiedades para esa referencia, ajuste "CopyLocal = true" (Crédito a Partha encima de este)
3

 
- Right click on the assembly name in your project reference. 
- select Properties 
- In the properties window set CopyLocal to true 

+0

Oh, olvidé mencionar eso en mi respuesta. : P +1 – Zack

0

Puede implementar dlls referenciadas donde lo desee. Tiene que agregar un archivo App.config (agregar/nuevo elemento/archivo de configuración de la aplicación) a su proyecto base y usar el sondeo de la etiqueta (configuración/tiempo de ejecución/assemblybinding/probing) para indicar una ruta para sus dlls.

Debe copiar el dll o dlls a esa ruta y agregarle una referencia en su proyecto. En las propiedades de referencia, coloque "copiar local" en "falso".

Cuestiones relacionadas