¿Cómo funciona el .NET / COM con múltiples versiones registrado a través de Regasm?

StackOverflow https://stackoverflow.com/questions/1718641

  •  19-09-2019
  •  | 
  •  

Pregunta

Tengo un .NET DLL (que pasa a ser escrito en C ++ / CLI). Partes de ella que quieren exponer a través de COM. Lo hago y registrarlo usando "my.dll regasm / código base". Hasta aquí todo bien. Pero entonces puedo cambiar algunas cosas y el número de versión de los cambios de montaje más muevo el archivo DLL en una carpeta diferente. Me registro de nuevo y miro el objeto COM en OLE / COM Visor. Veo algo como esto

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

Las preguntas sobre múltiples versiones:

  1. Así que creo que el último objeto COM que se gana registrado. No importa si tengo mi viejo objeto COM 7.0.0.0 registrado, el 7.0.0.27397 es la que se va a crear cuando mi instanciar objetos COM porque he registrado en último lugar. ¿Es correcto?

  2. Vaya no mantenía alrededor del objeto 7.0.0.0. ¿Hay alguna manera de deshacerse de él? ¿Hay alguna manera de quitar todas las versiones de un objeto COM distintos de entrar en el registro y golpear con la mano?

  3. Sólo por curiosidad, si yo quería específicamente para crear instancias de una versión particular de mi objeto COM ¿hay alguna manera de hacerlo? (Estoy usando C ++ si quería dar un ejemplo de código).

  4. ¿Hay alguna manera yo sólo puedo decir regasm no almacenar el número de versión ya que sólo parece ser que saturan las cosas y no puedo ver cuál es el beneficio. Si mi objeto COM pasó por cambio de API significativa que acababa de cambiar el GUID y progid, ¿verdad? ¿Qué pasa si no quiero registrar varias versiones (yo no).

¿Fue útil?

Solución

Siempre he establecido mis COM asambleas visibles con un AssemblyVersion estática precisamente por esta razón. Si usted quiere tener los binarios etiquetados con una versión, utilice AssemblyFileVersion lugar.

  1. Los últimos triunfos de objetos registrados: sip
  2. En realidad no. Usted puede poner cosas en ComRegisterFunction de su montaje / ComUnregisterFunction atribuirán métodos para automatizar la limpieza, pero si dejas versión antigua excrementos alrededor, se trata de la única manera.
  3. Usted lo haría con un GUID coclase diferente y / o identificador de programa (por ejemplo, MyCoClass.1, 0.2, etc). CoCreateInstance no sabe nada acerca de la versión de valores- se usan por el activador del CLR para asegurarse de que carga el ensamblado correcto.
  4. No-mejor que puede hacer nunca es cambiar la versión de ensamblado (véase más arriba).

Otros consejos

Los componentes con el mismo CLSID deben ser compatibles, especialmente si sólo ha cambiado el número de compilación entre los conjuntos. Aquí está la única lo relevante que encontré para confirmar esto por google rápidamente.

Para responder a sus preguntas directamente:

  1. correcta.
  2. regasm / anular el registro
  3. redirecciones de unión .
  4. Probablemente no.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top