2012-05-23 22 views
5

Estoy tratando de hacer un programa simple c# usando Growl C# API.referencia csc.exe archivo .dll externo

he intentado compilar mi programa de dos maneras diferentes:

1) Mantuve archivo .dll en el mismo directorio que mi archivo .cs. Luego ejecuté

csc /r:Growl.Connector.dll,Growl.CoreLibrary.dll /out:test.exe *.cs 

compiló bien y también funcionó bien.

2) Ahora he creado un directorio dentro de mi directorio de trabajo actual llamada growl y guardado todos mis .dll referencias allí.

Ahora, cuando intento compilar usando el comando a continuación

csc /r:"D:\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.Connector.dll","D: 
\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.CoreLibrary.dll" /out:test.exe *.cs 

Se compila bien, pero cuando traté de ejecutarlo se produjo la excepción mencionada a continuación.

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Growl.Connector, Version=2.0.0.0, Culture=n 
eutral, PublicKeyToken=980c2339411be384' or one of its dependencies. The system cannot find the file specified. 
at GrowlNotification.Program.Main(String[] args) 

lo tanto, mi pregunta es ¿cuál es la forma correcta de hacer referencia a .dll archivo en csc cuando los archivos están en una carpeta externa.

Aquí está el directory structure para el segundo caso.

Respuesta

9

Entonces, mi pregunta es ¿cuál es la forma correcta de hacer referencia al archivo .dll en cc cuando los archivos están en una carpeta externa.

Ya las está haciendo referencia en compilación time. Solo tiene que ponerlos a disposición en ejecución vez también, pero copiándolos en el mismo directorio que el ejecutable, cuando desee ejecutarlo.

También podría investigar el uso de Global Assembly Cache si estos son ensambles firmados, pero personalmente me quedaría con solo mantener el ejecutable con las bibliotecas de las que depende.

+0

Así que no hay manera de que pueda mantener el archivo '.dll' en una carpeta externa y ejecutar mi' .exe' simplemente 'haciendo doble clic' en él. Como entiendo por su respuesta, el archivo '.dll' debe estar presente en la misma carpeta que .exe en tiempo de ejecución. – RanRag

+0

@Noob: creo que podría estar en un * subdirectorio * si agrega un archivo app.config para especificar la búsqueda de ruta de contenedor privado, pero eso simplemente agrega aún más complejidad. Es todo * mucho * más simple si todo está en el mismo directorio. –

+0

Gracias por la información. – RanRag

1

Puede agregar estos usando los modificadores de línea de comandos/lib y/reference mientras compila.

http://msdn.microsoft.com/en-us/library/s5bac5fx.aspx

Pero (cita del artículo)

Una alternativa al uso/lib es copiar en el directorio de trabajo cualquier montajes requeridos; esto le permitirá simplemente pasar el nombre de ensamblaje a/referencia. A continuación, puede eliminar los ensamblados del directorio de trabajo . Dado que la ruta al ensamblado dependiente no está especificada en el manifiesto de ensamblaje, la aplicación se puede iniciar en el equipo de destino y encontrará y utilizará el ensamblado en el caché de ensamblaje global .

Dado que el compilador puede hacer referencia al ensamblado, no implica que el tiempo de ejecución de lenguaje común podrá encontrar y cargar el ensamblado en el tiempo de ejecución . Consulte Cómo ubica el tiempo de ejecución los ensamblados para obtener detalles sobre cómo el motor de tiempo de ejecución busca los ensamblados a los que se hace referencia.

por lo que la respuesta de Jon Skeet es mejor. (Solo estoy agregando esto para proporcionar más información que la que pude en un comentario, no como respuesta. La respuesta de Jon es la mejor IMO)

0

Puede crear symlinks en los ensambles de la carpeta de las bibliotecas, por lo que solo necesitaría para mantenerlos actualizados en un solo lugar.

Cuestiones relacionadas