Frage

Ich schreibe eine Klasse-Bibliothek (IE BHO) in C # und Gerangel derzeit mit der großen Menge an was ich denke, Junk-Ausgabe ist von regasm des erzeugten Registrierungsschlüssel kommen.

Die kurze Version ist dies: Ich möchte nur eine Handvoll von Klassen belichten (aktuell: ONE-Klasse) zu IE (und den Rest COM). Nur eine Klasse hat die ClassInterfaceAttribute und GUID Sachen Satz, und ich kann testen, ob die Add-On nur den COM-Registrierungsschlüssel für diese Klasse erfordert -. Und doch regasm generiert GUIDs und Registry-Schlüssel für jede Klasse im gesamten Projekt

Das ist ärgerlich und etwas störend, als ich meine Klassennamen nicht in der Benutzer-Registrierung sitzen will, wenn sie unbedingt hat , dort zu sein.

Um fair zu sein, sind viele dieser anderen Klassen öffentlich markiert, weil ich sie in einem Treiber App aus einem anderen Projekt in der gleichen Lösung verwenden, um IE-Debugging schwarzen Loch zu arbeiten ...

Ich bin immer noch sehr grün zu COM im Allgemeinen (vor allem auf .Net Bezug) und ich frage mich, was ist der beste Weg, um alle meine andere Klassen von regasm zu verbergen? Oder zumindest, warum diese Klassen, die - auch wenn sie öffentlich markiert sind - zeigen, wenn ich habe nicht eine des COM-Flags für sie

Danke!

War es hilfreich?

Lösung

Verwenden internal Zugriffsmodifikator für Sachen, die nicht public Modifikator haben muss. Für Sachen, die wirklich public Zugriff Verwendung ComVisible Attribut muss es teilweise zu verstecken.

Zum Beispiel:

[ComVisible(false)]
public class ClassToHide {
    //whatever
};

public class ClassToExpose {

     public void MethodToExpose() {}

     [ComVisible(false)]
     public void MethodToHide() {}
};

Alle öffentlichen Member-Funktionen und Membervariablen aller öffentlichen Klassen sind COM-standardmäßig sichtbar. Also zuerst denken an so dass sie interne und wenn Sie wirklich brauchen, um sie der Öffentlichkeit verstecken sie von COM mit ComVisible.

Andere Tipps

Versuchen Sie, den / regfile Schalter -. Diese ausgeben wird eine reg-Datei, anstatt direkt zu schreiben alle Ihre Klassennamen in der Registrierung

Wenn Sie die REG-Datei haben Sie alle Einträge entfernen können Sie nicht wollen, an die Zielsysteme Registrierung hinzugefügt werden, und Bereitstellen nur die Werte, auf die Zielmaschine. Je nachdem, wie Sie Ihre Software zu implementieren, könnte dies einfacher sein, und Sie würden nicht den Code ändern für jede Ihrer Typen.

In der Tat, wenn Sie nicht über Zugriff auf den Quellcode, ist dies der einzige Weg wäre, dies zu erreichen.

Ich schrieb eine COM-Komponente mit den gleichen Problemen.

I getrennt alle Nicht-COM-Funktionen in einem separaten Helfer DLL. Der COM-DLL enthält nur den Code, der registriert werden muss. Alles andere wird durch die Helfer DLL abgerufen.

Ich fand, dass ein einfacher Weg, um sicherzustellen, dass zukünftiger Code nicht versehentlich als public markiert werden würde, anstatt internal und zeigt in der Registrierung auf.

Stellen ComVisible Attribut auf false in Assembly Datei und legen ComVisible gelten nur für die gewünschten Klassen.

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