2012-01-09 20 views
6

Estoy intentando hacer referencia a un archivo DLL administrado en mi proyecto .NET, sin copiarlo en mi directorio de salida. Entonces, cuando mi programa se ejecuta, ejecuta el archivo DLL desde la ubicación en la que está instalado, donde sea que esté. El problema radica en el hecho de que esta DLL administrada llama a las DLL no administradas. Cuando trato de hacer referencia a la DLL administrada, arroja un FileNotFound Exception - Could not load file or assembly 'CharacterGen' or one of its dependencies. The system cannot find file specified. Cuando configuro mi salida para que esté dentro del mismo directorio que la DLL a la que me refiero, todo funciona bien. La solución habitual sería también hacer referencia a las DLL que se invocan desde el otro ensamblado. Sin embargo, no puedo hacer referencia a conjuntos no administrados desde mi programa administrado.Conjunto no gestionado de referencia

¿Hay alguna manera de hacer referencia a una DLL administrada que invoca DLL no administradas?

+0

¿Está familiarizado con GAC ..? si no quiere copiar en la carpeta bin entonces cree una carpeta separada, pero igual tendrá que copiar los archivos .dll a esa carpeta, remítelos ect ... si no, tendrá que hacer un poco de código LoadFromAssebly usando rutas de búsqueda, por qué no desea simplemente copiar los archivos .dll a una ubicación a la que se pueda hacer referencia de manera adecuada ... también ha pensado en crear un instalador MSI de esa manera si el usuario desea ejecutar su aplicación/configurarla en una estructura de directorio diferente ... en al menos pueden hacer eso y se manejarán las dependencias de referencia relacionadas. – MethodMan

+0

No estoy muy familiarizado con GAC, pero por lo que entiendo, los ensambles deben estar firmados. No tengo control sobre las DLL a las que me refiero, así que no puedo verificar si están firmadas o no. Pensé en un instalador, pero no quiero instalarlo en el directorio existente del usuario porque no es el directorio de mi programa, es uno que existe en las máquinas de mi cliente. Esa deberá ser mi alternativa si nada más funciona. – XSL

+1

El GAC no es útil para hacer referencia a archivos DLL no administrados. – BrainSlugs83

Respuesta

14

Si preguntando cómo obtener Visual Studio para copiar el archivo DLL no administrado a su directorio de salida se puede hacer esto:

  1. Agregar el archivo DLL no administrado como un archivo o documento vinculado en su proyecto. (haga clic derecho en proyecto -> agregar -> archivo existente y luego Agregar o Agregar como enlace).
  2. Seleccione el archivo en el explorador de soluciones. En la ventana de propiedades, establece la acción de compilación para copiar siempre.
+2

No olvide que la DLL no administrada podría requerir otras DLL no administradas. Si olvida agregarlos también, puede obtener el mismo error exacto. Puede usar el caminador de dependencias para ayudarlo si no está seguro de cuáles son las dependencias. – insipid

+1

"Copiar si es nuevo" funciona mejor. –

+0

¡Gracias! Para corregirte, Copy Always no se encuentra en "Build Action", está en "Copy to Output Directory". –

0

Si su solución tiene un montón de dlls C++ no administrados que está construyendo y uno o dos ensamblajes C# administrados, y todos deben estar en la misma carpeta, he encontrado que establecer todos los proyectos usar el mismo directorio de salida para ser la solución más fácil de administrar. - De esta forma, si los proyectos se renombran más tarde, etc., todos terminan en la ubicación correcta, y si agrega un nuevo proyecto más adelante, no tiene que averiguar qué dlls se deben agregar, usted solo necesita configurar el OutputPath exactamente como sus otros proyectos.

Para lograr esto establezco la propiedad OutputPath (para todas las configuraciones y plataformas, para cada proyecto) a $(SolutionDir)\bin\$(Configuration).

En general, no incluyo $(Platform) en el camino, ya que para los proyectos no administrados es llamado Win32 y para el administrado es llamado x86 - pero si realmente necesita la segregación plataforma que puede hacer un poco de lógica condicional en el .csproj archivos para crear una nueva propiedad que tenga el valor deseado.

Cuestiones relacionadas