Non ho lavorato con l'interoperabilità COM per un po 'di tempo, ma in passato ho sempre lavorato con la filosofia "opt-in" piuttosto che con "opt-out", cioè piuttosto che rendere visibile tutto ciò che è COM, contrassegno il assemblaggio come non visibile COM. Mi concentro quindi sull'esposizione selettiva di tipi \ membri (cioè optando in), e mi assicuro che l'API che viene esposta sia sana per COM (ad esempio COM non supporta Genrics, overload di metodi o costruttori che prendono parametri) e anche che ha stato testato con COM in mente. In questo modo, l'esposizione di un'API a COM viene eseguita in modo rigoroso, testato, limitato e gestibile.
Questo è l'opposto di rendere tutto COM visibile e quindi preoccuparsi di eventuali problemi futuri, tenendo presente che se si è esposto tutto, potrebbero esserci accoppiamenti con gli utenti dell'interfaccia COM che non ci si aspettava e che verranno ora avere difficoltà a uscire.
Dalla memoria un paio di esempi di conseguenze inaspettate:
Durante l'esportazione di metodi di overload, vengono esportati e denominate di default con un numero di sequenza per esempio OverloadedMethod1, OverloadedMethod2, ecc. Se si effettua il refactoring del codice e si modifica l'ordine dei metodi o si inserisce un sovraccarico, ecc., Si è quindi in difficoltà con chiunque abbia utilizzato questi metodi dalla precedente interfaccia COM. OverloadedMethod1 e OverloadedMethod2 potrebbero essere stati scambiati.
Le classi esposte a COM devono disporre di un costruttore senza parametri. Se non esiste un test unitario che mantenga questo contratto, allora è facile cambiare quella classe in un secondo momento in modo che non abbia un costruttore senza parametri e quindi interrompa gli utenti dell'interfaccia COM.
La cosa fondamentale è che l'esportazione di un interfaccia COM non viene gratis in quanto vi sono incompatibilità e requisiti che devono essere soddisfatti. Questo deve essere pensato e poi mantenuto. Attenzione CA1017 allude a questo.
fonte
2010-07-22 14:27:54
La domanda non era come risolvere. La domanda era, in primo luogo, cosa stesse cercando di mettere in guardia da questo avvertimento. – sharptooth
AS MSDN definisce anche la causa principale di questo avviso, ad es. "Un tipo visibile COM (Component Object Model) deriva da un tipo che non è COM visibile." –
Questo non è un problema difficile da trovare anche senza un avviso. Una parte molto volgare e sottile è che avrete tutte le cose pubbliche registrate in COM con un assembly ComVisible. – sharptooth