2010-08-31 27 views
5

Estoy escribiendo una aplicación para la API de Peachtree y necesita funcionar con cualquier versión de la API. Lamentablemente, el dll de Peachtree 2011 no puede interactuar con Peachtree 2010, y viceversa, a pesar de que los dos dlls se almacenan en la misma ubicación y se ejecutan exactamente con el mismo código.¿Cargar un dll COM en el tiempo de ejecución?

Pensé que debería poder referirme a la dll por su ruta de archivo, dejar la versión específica en falso, incrustar los tipos de interoperabilidad en falso, y copiar local en falso y simplemente usaría cualquier versión de la máquina, pero obtener un error cuando lo hago - "Excepción ha sido lanzada por el objetivo de una invocación".

¿Hay alguna manera de enlazar de forma definitiva el dll aunque sea COM?

Puedo proporcionar muestras de código de lo que sea que crea que sería útil, pero es más un problema de configuración de proyecto que cualquier otra cosa.

EDIT: Gracias a todos por su ayuda. Encontré mi solución en una pregunta de otra persona y la publiqué aquí.

+0

Normalmente se vincula la DLL de interoperabilidad en tiempo de compilación, y si está presente en el sistema, cargará el dll COM en tiempo de ejecución. ¿Hay más información en el error o una excepción interna? ¿Hay un código de error (0xZZZZZZZZ)? ¿Puedes vincular el seguimiento de la pila, o eso es dar demasiada información sobre tu aplicación? La API de Peachtree, ¿es COM, o es una DLL que se vincula a COM? –

Respuesta

7

La vinculación tardía a los objetos COM requiere que NO agregue una referencia a la biblioteca COM a su proyecto .NET. En su lugar, se debe utilizar algo como esto para crear objetos COM:

Type type = Type.GetTypeFromProgID("Excel.Application") 
    object app = Activator.CreateInstance(type); 

A continuación, se unirá a cualquier versión de la biblioteca en tiempo de ejecución COM.

Ver this article para más detalles.

+1

y con .net 4.0 puede usar el nuevo tipo 'dynamic' y tener enlace de llamada a método tardío, eliminando la necesidad de agregar una referencia de tipo http://msdn.microsoft.com/en-us/library/dd264736.aspx –

+0

Una cosa que me gustaría añadir es que, cuando obtiene el objeto de la instancia de creación, puede convertirlo al tipo de interfaz correcto, por lo que todavía tiene un enlace estático, aunque la creación se vincule tarde. – zumalifeguard

+0

Gracias por su ayuda. Tus ideas me llevaron por el camino correcto. – Yoenhofen

0

Ésta es la solución

Compile a version agnostic DLL in .NET

En caso de que vincular muere nunca, la clave está en controlar el evento AppDomain.CurrentDomain.AssemblyResolve como a continuación. El evento se desencadena cada vez que falla un enlace de ensamblaje, por lo que puede resolverlo usted mismo, solucionando conflictos de versión.

Cuestiones relacionadas