2009-11-11 14 views
6

Tengo una DLL .NET (que está escrita en C++/CLI). Partes de él quiero exponer a través de COM. Lo hago y lo registro usando "regasm my.dll/codebase". Hasta aquí todo bien. Pero luego cambio algunas cosas y el número de versión de los cambios de ensamblaje más muevo el dll a una carpeta diferente. Lo vuelvo a registrar y miro mi objeto COM en OLE/COM Viewer. Veo algo como esto¿Cómo funciona .NET/COM con múltiples versiones registradas a través de Regasm?

 
InprocServer32 [Codebase] = file://c://foo/bar/my.dll 
7.0.0.0 [Class] = My.Blah.Class 
7.0.0.0 [Assembly] = Sync, Version=7.0.0.0, Culture=neutral, PublicKeyToken=1dd19234234 
7.0.0.0 [RuntimeVersion] = v2.0.50727 
7.0.0.0 [CodeBase] = file://c:/dooby/do/my.dll 
7.0.0.27397 [Class] = My.Blah.Class 
7.0.0.27397 [Assembly] = Sync, Version=7.0.0.27397, Culture=neutral, PublicKeyToken=1dd19234234 
7.0.0.27397 [RuntimeVersion] = v2.0.50727 
7.0.0.27397 [CodeBase] = file://c://foo/bar/my.dll 

Preguntas sobre múltiples versiones:

  1. Así que creo que el último objeto COM que se gana registrado. No importa si tengo mi antiguo objeto COM 7.0.0.0 registrado, el 7.0.0.27397 es el que se creará cuando crea una instancia de mi objeto COM porque lo registré al último. ¿Es eso correcto?

  2. Vaya, no guardé el objeto 7.0.0.0. ¿Hay alguna forma de deshacerse de él? ¿Hay alguna manera de eliminar todas las versiones de un objeto COM que no sea entrar en el registro y golpearlo a mano?

  3. Solo por curiosidad, si específicamente quería crear una instancia de una versión particular de mi objeto COM, ¿hay alguna forma de hacerlo? (Estoy usando C++ si quieres dar un ejemplo de código).

  4. ¿Hay alguna forma en que pueda decirle a regasm que no almacene el número de versión porque parece que está abarrotando las cosas y no puedo ver cuál es el beneficio? Si mi objeto COM pasó por un cambio significativo en la API, simplemente cambiaría el GUID y el programa, ¿no? ¿Qué ocurre si no quiero registrar varias versiones (no las tengo)?

Respuesta

5

Siempre configuré mis ensamblajes COM visibles con una AssemblyVersion estática por este solo motivo. Si desea tener binarios etiquetados con una versión, use AssemblyFileVersion en su lugar.

  1. Últimos victorias objeto registrado yep
  2. No
  3. realmente. Puede poner cosas en los métodos atribuidos ComRegisterFunction/ComUnregisterFunction de su ensamblaje para automatizar la limpieza, pero si deja excrementos de versiones anteriores, esta es la única forma.
  4. Lo harías con un GUID y/o ProgID de coclass diferente (por ejemplo, MyCoClass.1, .2, etc.). CoCreateInstance no sabe nada sobre los valores de la versión: el activador de CLR lo usa para asegurarse de que cargue el ensamblaje correcto.
  5. No, lo mejor que puede hacer es cambiar su versión de ensamblaje (consulte más arriba).
+0

Estoy viendo evidencia de que COM siempre selecciona la versión con el número más alto de un componente registrado con múltiples versiones, no la última versión registrada. ¿Alguien puede confirmar esto? – BlueMonkMN

0

Los componentes con el mismo CLSID deben ser compatibles, especialmente si solo ha cambiado el número de compilación entre los ensamblajes. Aquí está el único relevant que encontré para confirmar esto buscando en Google rápidamente.

para responder a sus preguntas directamente:

  1. correcta.
  2. regasm/unregister
  3. Busque en Binding redirects.
  4. Probablemente no.
Cuestiones relacionadas