Frage

Ich muss mehrere Versionen desselben C# .NET -Projekts bereitstellen. Die Projektausgabe ist eine COM -Interop -Baugruppe, die in einer nativen Anwendung verwendet wird. Das Problem, das ich habe, ist, dass ich mehrere Versionen dieser Baugruppe nebeneinander bereitstellen muss, aber was auch immer ich tue, scheint nicht unterschiedliche Versionen zu erstellen. Stattdessen überschreiben sich die Versionen gegenseitig.

Ich habe versucht, die Montage -GUID zu ändern, versucht zu ändern, die Vermittlungsnummern der Montage zu ändern, versuchte, die starke Namenstaste der Montage zu regenerieren, und habe versucht, den Montage -Titel und die Beschreibung der Montage zu ändern. Ich müsste lieber die Richtlinien oder Namen für einzelne Typen in der Montage zu Versionierungszwecken nicht ändern.

Wie stelle ich sicher, dass diese Versionen sich nicht gegenseitig überschreiben und sie nebeneinander sehen und bereitstellen können?

Danke im Voraus!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace InteropTest
{
    [Guid("...")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class Test
    {
        public Test()
        {
        }

        public string Version
        {
            get
            {
                return "1.0";
            }
        }
    }
}
War es hilfreich?

Lösung

Ich müsste lieber die Richtlinien oder Namen für einzelne Typen in der Montage zu Versionierungszwecken nicht ändern.

Aber das exakt Was Sie tun müssen, um zu verhindern, dass COM -Typen sich gegenseitig stören. Mit dem [Guid] wird der Registrierungsschlüssel in HKLM Software classes clsid ausgewählt, in dem die COM -Klasse registriert ist. Zwei unterschiedliche Versionen mit demselben Guid überschreiben gegenseitig die Schlüssel. Sonst bekannt als DLL Hell. Ändern der öffentlichen Schnittstelle erfordert Eine neue Richtlinie, um sicherzustellen, dass Kunden, die den alten verwenden, nicht sterben, um Fehlverhalten zu diagnostizieren. Eine steinharte COM-Anforderung.

Das Auslassen des [Guid] -attributs ist sehr gut möglich. Überlassen Sie es jetzt dem CLR, einen für Sie zu generieren. Jetzt spielen die Montageattribute eine Rolle, der Richtwert wird durch einen Slick-Algorithmus automatisch generiert, der den Montagennamen und die Version sowie die Methodenmenge auf der Schnittstelle und deren Argumente enthält. So sorgen Sie dafür irgendein ändert automatisch eine andere Richtlinie. Und, wie erwartet und erforderlich, wird eine andere [Assemblyversion] eine andere [GUID] erzeugen.

Ein anderer Ansatz, was ich mit "Seite an Seite" gemeint habe, ist zu nicht Registrieren Sie die Versammlung, verlassen Sie sich jedoch stattdessen auf ein Manifest. Es muss in das Client -Programm eingebettet sein, Sie verwenden die <clrClass> Element, um Ihre [komvisible] Klasse zu deklarieren. Versioning wird jetzt zu einem Bereitstellungsdetail. Die MSDN-Anleitungen ist hier. Denken Sie daran, dass es in die eingebettet sein muss Klient Programm, nicht Ihre [comvisible] Versammlung. Das ist tendenziell ein Problem.

Andere Tipps

Versuchen Sie, die verspätete Bindung an die Interop -Baugruppe in Ihrer nativen Anwendung zu binden, wenn Sie können. Ich würde auch von der automatischen Generierung der Schnittstelle mit autoduellem und stattdessen explizit Ihre eigene Lektüre beraten Dies Für mehr Information. Sie können das Problem beheben, indem Sie Regedit eröffnen und nach dem GUID und dem Progid suchen, um zu sehen, welche Versionen der Versammlung registriert wurden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top