No he trabajado con COM interopera desde hace bastante tiempo, pero en el pasado siempre he trabajado con la filosofía "opt-in" en lugar de "opt-out", es decir, en lugar de hacer que todo sea visible, marcó el ensamblaje no es COM visible. Luego me concentro en exponer los miembros de los tipos selectivamente (es decir, participando), y me aseguro de que la API que está expuesta esté en forma para COM (por ejemplo, COM no es compatible con Genrics, sobrecarga de métodos o constructores que toman parámetros) y también que tiene probado con COM en mente. De esta manera, exponer una API a COM se hace de una manera rigurosa, probada, limitada y mantenible.
Esto es lo contrario a hacer que todo sea visible y luego preocuparse por posibles problemas posteriores, teniendo en cuenta que si ha expuesto todo, puede haber acoplamientos con usuarios de su interfaz COM que no esperaba y ahora tiene dificultades para retroceder.
de memoria un par de ejemplos de consecuencias inesperadas:
Al exportar métodos sobrecargados, se exportan y se nombran de forma predeterminada con un número de secuencia, por ejemplo, OverloadedMethod1, OverloadedMethod2, etc. Si refactoriza su código y cambia el orden de sus métodos o inserta una sobrecarga, etc., entonces tendrá problemas con cualquiera que haya usado estos métodos desde su interfaz COM anterior. OverloadedMethod1 y OverloadedMethod2 pueden haber sido intercambiados.
Las clases que están expuestas a COM deben tener un constructor sin parámetros. Si no existe una prueba unitaria que mantenga este contrato, entonces es fácil cambiar esa clase en una fecha posterior para que no tenga un constructor sin parámetros y así se rompa la interfaz COM de los usuarios.
La clave es que la exportación de una interfaz COM no viene de forma gratuita, ya que hay incompatibilidades y requisitos que se deben cumplir. Esto tiene que ser pensado y luego mantenido. Advertencia CA1017 alude a esto.
La pregunta no era cómo solucionarlo. La pregunta era de qué estaba tratando de advertir esta advertencia en primer lugar. – sharptooth
AS MSDN también define la causa raíz de esta advertencia, es decir, "Un tipo visible del Modelo de objetos componentes (COM) deriva de un tipo que no es COM visible". –
No es un problema difícil de encontrar, incluso sin una advertencia. Una parte mucho más sutil y sutil es que tendrá todas las cosas públicas registradas en COM con un ensamblaje ComVisible. – sharptooth