2011-02-10 60 views
8

¿Cómo puedo hacer referencia correctamente a una DLL C# a la que no tengo acceso físico? (De hecho, tengo la DLL, pero no todas sus dependencias.)¿Cómo puedo usar un dll C# (managed) que no tengo?

Antecedentes:

En el equipo de destino, hay un programa y muchos archivos dll interdependientes instalado en C:\FancyProgram.

Necesito escribir una aplicación simple que se implementará en la computadora de destino en C:\SimpleProgram.

Este sencillo programa necesitará realizar algunas llamadas a uno de los archivos dll bajo C:\FancyProgram. Es una .net administrada DLL

En mi máquina de desarrollo, hago no tengo una copia de FancyProgram. Tengo ese archivo DLL, pero no tengo muchas dependencias. Tampoco puedo agrupar esa DLL en SimpleProgram.

¿Cuál es el método correcto para usar y hacer referencia a esta DLL en mi proyecto de Visual Studio de modo que mi SimpleProgram compile correctamente pero cargue la DLL en tiempo de ejecución desde la ubicación correcta?

Gracias

+2

dll administrado (.NET) o no administrado? –

+0

Administrado. (actualizado. Gracias.) – nonot1

+0

Desde la ubicación correcta también será un problema en el caso administrado porque desde C: \ SmpleProgram no se cargarán dll desde C: \ FancyProgram. ¿O son las dependencias GAC-ed? Nunca lo intenté si un enlace simbólico lo solucionaría (Sí: http://weblogs.asp.net/israelio/archive/2011/01/10/how-to-overcome-the-clr-fusion-limitation.aspx) – rene

Respuesta

0

Uhhhh, ¿qué vas a hacer al respecto que las pruebas? Suponiendo que ya se ha dado cuenta de que necesita asegurarse de que el .dll está en el GAC y lo referencia de esa manera (idealmente) o, el .dll debe estar en el mismo lugar en todas las computadoras. Agregue el .dll en sus referencias y márquelo como Copiar local: falso, para que no lo implemente. Buena suerte.

+0

Las pruebas se realizarán en una máquina de destino. (Es solo una pequeña parte del código). La DLL estará en la ubicación especificada exacta en todas las máquinas de destino. ¿Cómo le digo a mi programa que lo cargue en tiempo de ejecución desde una ubicación específica? – nonot1

+0

Sabiendo eso, iría con la sugerencia de zihotki. – RobertG5

1

Es posible que desee mirar los detalles de LoadLibrary, GetProcAddress y Marshal.GetDelegateForFunctionPointer.

También construiría dll para probar localmente, con la misma interfaz que su dll externo. La cantidad de funcionalidad que pongas allí depende de la complejidad de la interfaz y tu SimpleProgram.

Hubo algunas respuestas excelentes a mi antiguo question sobre la importación de dlls externos.

3

.Net hará enlaces finales de todos modos. Siempre y cuando no haga referencia al archivo .dll de ninguna manera hasta que tenga la intención de cargarlo, esto funcionará.

Simplemente encapsula todas las referencias (campos, propiedades, métodos, instancias) en una clase o proyecto spearate y crea una instancia solo cuando sea necesario. A continuación, puede intentar capturar el error de carga. Vea la ventana Salida de Visual Studio cuando se ejecuta su aplicación, le dirá cuándo está intentando cargar qué .dll.

También puede que desee ver en estos eventos para hacer sus errores mango aplicación con gracia:

AppDomain.CurrentDomain.AssemblyLoad += ...; 
AppDomain.CurrentDomain.AssemblyResolve += ...; 
AppDomain.CurrentDomain.UnhandledException += ...; 
AppDomain.CurrentDomain.FirstChanceException += ...;

Usted también puede querer tomar el enfoque MEF. Es un marco para cargar/encuadernar tarde.

Cuestiones relacionadas