Domanda

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 spazzatura proveniente dalle chiavi di registro generate da REGASM.

La versione breve è questa: voglio solo esporre una manciata di classi (attualmente: UNA classe) a IE (e al resto di COM). Solo una classe ha le cose ClassInterfaceAttribute e GUID impostate e posso verificare che il componente aggiuntivo richiede solo le chiavi di registro COM per questa classe - eppure, REGASM genera GUID e chiavi di registro per ogni classe nell'intero progetto.

Questo è fastidioso e alquanto inquietante in quanto non voglio che i miei nomi di classe si trovino nel registro degli utenti a meno che non abbiano assolutamente presente.

Per essere onesti, molte di quelle altre classi sono contrassegnate come pubbliche perché le uso in un'app driver di un altro progetto nella stessa soluzione, per aggirare il buco nero di debug di IE ...

Sono ancora molto rispettoso della COM in generale (in particolare per quanto riguarda .Net) e mi chiedevo quale sia il modo migliore per nascondere tutte le mie altre classi dal regime? O, almeno, perché queste classi che - sebbene siano contrassegnate come pubbliche - vengono visualizzate quando non ho impostato alcun flag COM per loro?

Grazie!

È stato utile?

Soluzione

Usa il modificatore di accesso interno per cose che non hanno bisogno del modificatore pubblico . Per cose che hanno davvero bisogno dell'accesso pubblico usa l'attributo ComVisible per nasconderlo parzialmente.

Ad 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 dei membri di tutte le classi pubbliche sono COM visibili per impostazione predefinita. Quindi, prima pensa a renderli interni e se ne hai davvero bisogno, nascondili dalla COM con ComVisible.

Altri suggerimenti

Prova a usare l'opzione / regfile - questo produrrà un file reg piuttosto che scrivere direttamente tutti i nomi delle tue classi nel registro.

Quando si dispone del file .reg è possibile 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 dovresti cambiare il codice per nessuno dei tuoi tipi.

In effetti se non si ha accesso al codice sorgente, questo sarebbe l'unico modo per raggiungere questo obiettivo.

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 assicurarmi che il codice futuro non venisse accidentalmente contrassegnato come public anziché internal e visualizzato nel registro.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top