2010-05-19 25 views
6

Un cliente desea consumir nuestras DLL .NET desde VB6. Están diseñados para admitir interoperabilidad inversa y todo funciona bien ... excepto: Hay dos programas VB6 separados en dos directorios diferentes. Parece que es necesario hacer uno de:¿Cómo encuentra un programa COM una DLL .NET registrada para COM Interop?

  1. Copiar el .NET DLL en ambos directorios, o
  2. instalar .NET DLL en la GAC ​​

Esta es la observación del cliente y también apoyó por el RegAsm documentation:

Después de registrar un ensamblado utilizando Regasm.exe, se puede instalar en la memoria caché de ensamblados global para que puede ser activado desde cualquier cliente COM. Si el conjunto solo va a ser activado por una sola aplicación, usted puede colocarlo en el directorio de esa aplicación.

Estoy confundido en este punto.

primer punto de confusión:

Por lo que yo entiendo, el tiempo de ejecución COM localiza el archivo DLL utilizando el ID/ID Clase Prog. Cuando miro en el registro en la entrada de identificación de clase, veo la ruta completa a la DLL .NET en la clave CodeBase. ¿Por qué un programa COM que utiliza la Id. De clase/Id. De clase no encuentra la DLL .NET utilizando CodeBase?

Segundo punto de confusión:

El GAC es específico de .NET. ¿Cómo está involucrado en la resolución de referencias COM?

Respuesta

6

Tiene razón COM utiliza el ProgId para llegar al ClassId y acceder al servidor COM para cargarlo. En el caso de .NET COM dlls, el servidor COM es realmente MSCOREE, no el .NET dll (el valor de la clave predeterminada en {CLSID}/localserver32). MSCOREE, no COM, puede usar las reglas que quiera para encontrar el ensamblado de .NET.

En este punto, no sé lo que .NET realmente hace, eso requeriría pruebas. Puedes verte usando el FUSLOGVW. Sin embargo, puedo adivinar que carga el ensamblaje como si cargara cualquier otro ensamblado .NET.

Suponiendo que solo llama a Assembly.Load() con el valor ClassName, seguirá al .NET binding rules. Primer vistazo en el GAC, si no se encuentra, sondeará, por lo que si se define una base de código, solo se verá allí; de lo contrario, buscará según la base de la aplicación (de manera predeterminada el directorio de la aplicación [pero no para ASP.NET ]).

Creo que encaja con lo que lee en regasm.

Su pregunta es tan viejo que supongo que ha sido OBE, pero las reglas que usaría para poner asambleas en el directorio de aplicación, usar una base de código, o en la GAC ​​ son los mismos y w/o com interop. Cada situación es diferente y no he hecho suficiente .NET para renunciar a ningún conocimiento profundo. Estoy a favor de las instalaciones de xcopy, así que me gustaría ir al directorio de la aplicación (y usar registration free COM), pero hay otras consideraciones como si las dos aplicaciones vb deben usar la misma versión del objeto COM.

Cuestiones relacionadas