C #: Regasm genera voci di registro per ogni class nella mia DLL COM?

Sto scrivendo una libreria di classi (IE BHO) in C # e attualmente sto litigando con il grande volume di quello che penso sia l’output junk proveniente dalle chiavi di registro generate da REGASM.

La versione breve è questa: voglio solo esporre una manciata di classi (attualmente: UNA class) in IE (e il resto della COM). Solo una class ha il set di roba ClassInterfaceAttribute e GUID e posso verificare che il componente aggiuntivo richieda solo le chiavi di registro COM per questa class, eppure REGASM genera GUID e chiavi di registro per ogni class nell’intero progetto.

Questo è fastidioso e un po ‘inquietante in quanto non voglio che i miei nomi di class siano inseriti nel registro degli utenti a meno che non debbano assolutamente esserci.

Per essere onesti, molte di queste altre classi sono contrassegnate come pubbliche perché li uso in un’app di driver da un altro progetto nella stessa soluzione, per aggirare il buco nero di debug di IE …

Sono ancora molto ecologico per COM in generale (specialmente riguardo a .Net) e mi chiedevo qual è il modo migliore per hide tutte le altre classi dal regasmo? O, almeno, perché queste classi che – anche se sono contrassegnate come pubbliche – vengono mostrate quando non ho impostato alcuno dei flag COM per loro?

    Grazie!

    Usa il modificatore di accesso internal per cose che non hanno bisogno di avere public modificatore public . Per cose che hanno davvero bisogno di accesso public usa l’attributo ComVisible per nasconderlo parzialmente.

    Per esempio:

     [ComVisible(false)] public class ClassToHide { //whatever }; public class ClassToExpose { public void MethodToExpose() {} [ComVisible(false)] public void MethodToHide() {} }; 

    Tutte le funzioni dei membri pubblici e le variabili membro di tutte le classi pubbliche sono COM-visibili per impostazione predefinita. Quindi prima pensa di renderli interni e se hai davvero bisogno di loro nasconderli da COM con ComVisible.

    Prova a usare l’opzione / regfile – questo produrrà un file reg invece di scrivere direttamente tutti i nomi delle classi nel registro.

    Quando si ha il file .reg, è ansible rimuovere tutte le voci che non si desidera aggiungere al registro dei sistemi di destinazione e distribuire solo quei valori sul computer di destinazione. A seconda di come scegli di distribuire il tuo software, questo potrebbe essere più semplice e non dovrai modificare il codice per nessuno dei tuoi tipi.

    Infatti se non si ha accesso al codice sorgente, questo sarebbe l’unico modo per ottenere questo.

    Ho scritto un componente COM con gli stessi problemi.

    Ho separato tutte le funzioni non COM in una DLL helper separata. La DLL COM contiene solo il codice che deve essere registrato. Tutto il resto è accessibile tramite la DLL helper.

    Ho scoperto che un modo semplice per assicurarsi che il codice futuro non venga accidentalmente contrassegnato come public anziché internal e visualizzato nel registro.

    Imposta l’attributo ComVisible su false nel file AssemblyInfo e imposta l’applicazione ComVisible solo per le classi desiderate.