2011-02-12 7 views
9

Tengo una DLL existente que no es CLS-obediente a la que hago referencia desde mi propio proyecto. Cuando marque mi ensamblaje como CLS-obediente, recibo advertencias del compilador de que los nombres en el ensamblaje al que se hace referencia no son compatibles con CLS.¿Puede un ensamblaje que incluye una referencia que no cumple con CLS ser compatible con CLS?

¿Hay alguna manera de que pueda mantener mi ensamblador compatible con CLS y marcar el que se referencia como no?

Respuesta

10

Sí, su DLL puede ser compatible con CLS siempre que no exponga ningún miembro que no sea compatible con CLS del conjunto al que se hace referencia, es decir, no los menciona en ninguno de sus propios públicos o miembros o tipos protegidos. (Todavía puede usarlos en miembros y tipos privados e internos.)

Si su DLL necesita exponer tipos directamente de la DLL no compatible, puede intentar encapsular esos tipos en sus propios contenedores (por ejemplo, un método) podría devolver un MyWrapperAroundNaughtyType en lugar de un NaughtyType), o puede marcar los miembros relevantes de su API CLSCompliant(false) para optar solo por aquellos miembros que no estén en la verificación del compilador.

+0

¿Debo marcar también "Insertar tipos de interoperabilidad" como falso? (Es una biblioteca COM que no cumple con CLS debido a los nombres con caracteres de subrayado). – ide

+0

No estoy seguro. Dado que los tipos de interoperabilidad que utilizaría son públicos, se incorporarán como públicos, lo que significa que se comprobará si cumplen con CLS. Pero cuando hice un experimento rápido, pareció ir bien, pero tal vez tuve suerte con mis tipos de COM. Tal vez intente crear un pequeño conjunto ficticio que importe los tipos COM problemáticos y pruébelo antes de embarcarse con su ensamblaje real. – itowlson

+2

Acabo de probarlo con 'Microsoft.Office.Interop.Excel' y recibo advertencias si lo incluyo en una instrucción' using' en cualquier lugar. Parece que marcar mi ensamblaje como no conforme o no incrustar los tipos de interoperabilidad es el camino a seguir. O podría calificar completamente todos los nombres de clase ... nah. – ide

Cuestiones relacionadas