Wie funktioniert .NET / COM Arbeit mit mehreren Versionen über Regasm registriert?

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

  •  19-09-2019
  •  | 
  •  

Frage

Ich habe einen .NET-DLL (die in C ++ / CLI geschrieben werden passiert). Teile davon möchte ich über COM belichten. Ich tue dies, und registrieren Sie es mit „regasm my.dll / Code-Basis“. So weit, ist es gut. Aber dann wechsle ich ein paar Dinge und die Versionsnummer der Baugruppe ändert und ich bewege die DLL in einem anderen Ordner. Ich melde ich wieder und Blick auf meinem COM-Objekt in OLE / COM-Viewer. Ich sehe so etwas wie diese

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

Fragen über mehrere Versionen:

  1. So denke ich, dass das letzte COM-Objekt, das gewinnt registriert wurde. Es spielt keine Rolle, ob ich mein altes 7.0.0.0 COM-Objekt registriert habe, die 7.0.0.27397 ist derjenige, der geschaffen wird, wenn ich mein COM-Objekt instanziiert, weil ich es zuletzt registriert. Ist das richtig?

  2. Oops ich habe halten um nicht das Objekt 7.0.0.0. Gibt es einen Weg, um es loszuwerden? Gibt es eine Möglichkeit, alle Versionen eines COM-Objekt andere als in die Registry entfernen gehen und whacking es von Hand?

  3. Nur aus Neugier, wenn ich speziell eine bestimmte Version meines COM-Objekts instanziiert will, ist es eine Möglichkeit, das zu tun? (Ich bin mit C ++, wenn Sie ein Codebeispiel geben wollte).

  4. Gibt es eine Möglichkeit, nur regasm sagen kann, nicht die Versionsnummer zu speichern, weil es scheint, nur Dinge zu unübersichtlich und ich kann nicht sehen, was der Nutzen ist. Wenn mein COM-Objekt durch signifikante API Änderung geht würde ich ändern, nur die GUID und progid, nicht wahr? Was passiert, wenn ich mehrere Versionen nicht registrieren will (ich nicht).

War es hilfreich?

Lösung

ich immer meine COM sichtbar Baugruppen nach oben mit einem statischen Assembly gesetzt aus genau diesem Grund. Wenn Sie Binärdateien haben wollen getaggt mit einer Version, die Verwendung Assembly statt.

  1. Zuletzt registrierte Objekt gewinnt: yep
  2. Nicht wirklich. Sie können Material in Ihrem Assembly ComRegisterFunction setzen / ComUnregisterFunction zugeschrieben Methoden, um die Bereinigung zu automatisieren, aber wenn Sie alte Version Kot verlassen um, ist dies über die einzige Art und Weise.
  3. Sie tun würden, es mit einer anderen Co-Klasse GUID und / oder Programm-ID (zB MyCoClass.1, 0,2, etc). CoCreateInstance nichts über die Version wissen Werte- sie durch den Aktivator CLR verwendet sind es die Montage richtig geladen zu gewährleisten.
  4. No- Beste, was zu tun ist nie Ihre Assembly Version ändern (siehe oben).

Andere Tipps

Komponenten mit denselben CLSID sollten kompatibel sein, vor allem, wenn Sie nur die Build-Nummer zwischen Baugruppen geändert haben. Hier ist der einzige relevant , was ich diese schnell durch googeln, um zu bestätigen gefunden.

Ihre Fragen beantworten direkt:

  1. Richtig.
  2. regasm / unregister
  3. Schauen Sie in Bindung Umleitungen .
  4. Wahrscheinlich nicht.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top