2010-03-15 6 views
27

Estoy usando EmguCV para un proyecto y cuando nuestro programa se ejecuta necesita algunas DLL como "cxcore.dll", etc. (o arroja excepciones de tiempo de ejecución). Por el momento, puse los archivos en la raíz de la carpeta de salida (seleccionada "Copiar siempre" en las propiedades del archivo en Visual Studio).C# Colocando las DLL requeridas en algún lugar que no sea la raíz de la salida

Sin embargo, parece un poco complicado, tener aproximadamente 10 dlls diferentes allí. ¿Existe alguna manera en que pueda moverlo a una subcarpeta en la carpeta de salida y todavía lo encontrará?

+0

¿Desea hacer referencia a ellos desde otra ubicación (es decir, estar incluido con todas las otras bibliotecas dependientes) o tener una subcarpeta debajo de su directorio bin? ¿Están estos ** incluidos ** en el proyecto, o están ** cargados ** (Assembly.Load, o P/Invoked) en su aplicación? – GrayWizardx

+0

@Gray: quiero ponerlos en una subcarpeta debajo de mi directorio bin. No uso estos dlls directamente, pero los usa el proyecto EmguCV (creo que son P/invocados). Además, creo que los dlls se escribieron en C. Si los dlls están ausentes, aún puedo construir, pero obtendría una excepción de tiempo de ejecución. – Aishwar

Respuesta

-2

Puede copiar los dll al lugar que desee utilizando los eventos de compilación pre/post y las macros que le indican dónde está su carpeta de salida.

Pero, si los dll no están en el mismo directorio que el ejecutable, no se cargarán. Si se administran, puede cargarlos manualmente con los métodos Assembly.Load. Si no están administrados, no sé cómo puedes hacerlo.

+1

tenga cuidado con los eventos de compilación pre/post, especialmente en entornos en los que esté trabajando con varios desarrolladores y/o compilación automatizada. Pueden ser grandes trampas. – GrayWizardx

-3

Puede guardarlo en otro lugar y seguir vinculándolo. En las propiedades de referencia, establezca "Copiar local" en falso y establezca la ruta en consecuencia. Esto funcionará Si se supone que el DLLS externo cambia la versión, puede establecer "Versión específica" en falso para poder vincular a cualquier versión.

55

Respuestas asombrosas hasta el momento. Ninguno correcto;) Bueno,

sí, puede colocar los conjuntos en ubicaciones separadas.

En la configuración de la aplicación correspondiente (app.config la que se copia a your.exe.config) añadir:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="lib" /> 
    </assemblyBinding> 
    </runtime> 

De acuerdo con:

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

Esto hará que el programa busque en el camino privado (carpetas debajo de su propia carpeta) para ensamblajes, al igual que una aplicación web busca/bin.

También puede ponerlos en el GAC, pero eso debe evitarse a menos que haya otras razones para esto.

Dicho esto, realmente no es necesario. Los usuarios no se confundirán si instala la aplicación correctamente en el menú de inicio;) Nunca tuve ese problema, incluidos los proyectos con más de 50 ensamblajes. Los usuarios simlpy nunca los ven.

+0

@TomTom La respuesta svish es la correcta –

+0

En cuanto a su respuesta. ¿Estás seguro de que funcionará con librerias no administradas? –

+0

@TomTom: ¿Sería lo anterior en mi archivo '.csproj'? Mi proyecto es una aplicación C# winforms - No puedo encontrar un archivo '.config'. – Aishwar

17

Para obtener los ensamblajes en un subdirectorio, puede copiarlos allí de forma manual, usar un evento previo o posterior a la construcción o algo completamente diferente.

Para cargarlos, puede usar AppDomain.AssemblyResolve Event, o (según lo observado por TomTom) <probing> Element. De MSDN:

El siguiente ejemplo muestra cómo especificar los subdirectorios base de la aplicación que el tiempo de ejecución debe buscar ensamblajes.

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="bin;bin2\subbin;bin3"/> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

El GAC es, por supuesto, otro lugar para volcar las asambleas, pero eso no sería realmente cuenta como un subdirectorio ...a menos que instale su aplicación en alguna parte, realmente no debería instalarse: P

+0

@Svish: ¿Sería lo anterior en mi archivo .csproj? Mi proyecto es una aplicación C# winforms: no puedo encontrar un archivo .config. – Aishwar

+0

@ aip.cd.aish: hay un ejemplo más completo en http://msdn.microsoft.com/en-us/library/4191fzwb(v=VS.90).aspx. Si no hay un archivo de configuración, puede simplemente crear uno. Según http://msdn.microsoft.com/en-us/library/ms229689(v=VS.90).aspx se supone que debe tener el mismo nombre que su aplicación con la extensión .config. – Svish

+0

El archivo también podría llamarse solo app.config ... pero no estoy seguro. Lea sobre los archivos de configuración en MSDN y debe averiguarlo :) – Svish

Cuestiones relacionadas