2011-11-16 9 views
6

¿Hay alguna forma de crear errores de tiempo de compilación si se llama a un método determinado?¿Evita que el código .NET invoque métodos particulares?

Como ejemplo, lo que me gustaría hacer es evitar que el código en un determinado proyecto llame a System.Configuration.ConfigurationManager.AppSettings(). ¿Hay alguna manera de etiquetar el proyecto o el archivo de clase para generar un error de tiempo de compilación SI se llama ese método?

No creo que exista, entonces mi pensamiento es que la única manera de hacerlo es generar una regla FxCop que marque estas llamadas y lo haga de esa manera, pero estoy abierto a otras ideas.

Estoy usando .NET 3.5. No estoy seguro si los contratos de código 4.0 pueden hacer esto.

Actualizaciones

Estoy hablando específicamente acerca de los métodos marco, no la mía, así que no puede marcarlos como obsoleto.

En este momento no me importa la reflexión.

Otro ejemplo es System.Web.HttpUtility.HtmlEncode, que quiero encontrar y reemplazar con la biblioteca AntiXss de Microsoft, pero me gustaría integrar algún tipo de proceso de comprobación en mi servidor de compilación que verifique también el nuevo código .

+0

¿Quieres llamar a este método no permitir través de la reflexión, también? – Vlad

+1

Si fueron sus propios ensamblajes y puede recompilar, puede usar el atributo Obsoleto, si eso ayuda en absoluto. – asawyer

+0

¿Por qué hay para empezar si no quieres que lo usen? –

Respuesta

2

La herramienta NDepend se puede utilizar para eso (Descargo de responsabilidad: soy uno de los desarrolladores de la herramienta).

Puede escribir algunos Code Rules over LINQ Queries (CQLinq) para verificar cualquier tipo de dependencia, como una llamada a un método, por ejemplo. Las reglas del código pueden ser checked in Visual Studio después de cada compilación exitosa, o rules can be checked at build process time también.

Tal regla de código de CQLinq puede verse como:

warnif count > 0 
from m in Application.Methods   
where m.IsUsing("System.Configuration.ConfigurationManager.get_AppSettings()") 
select m 

La regla se puede especializar a su antojo, para prohibir, por ejemplo, los espacios de nombres que coinciden con una expresión regular, para contener métodos que llaman al método get_AppSettings() captador:

warnif count > 0 
from m in Application.Namespaces.WithNameLike("regex").ChildMethods() 
where m.IsUsing("System.Configuration.ConfigurationManager.get_AppSettings()") 
select m 

Desde el NDepend dependency matrix o dependency graph, también puede hacer clic derecho una dependencia (celda de la matriz o de gráfico de flecha) y generar una regla de código que avisa si existe la dependencia y (luego se especializan la regla de generación rados si es necesario):

enter image description here

+0

Solo he usado el NDepender de la interfaz de usuario. Tendré que verificar si puedo integrarlo en nuestros scripts de compilación CruiseControl.NET/NAnt. ¿Es eso posible? – slolife

+0

Sí, esto es posible, lea nuestro documento relacionado con la integración CC.NET: http://www.ndepend.com/Doc_CI_CCNet.aspx –

4

Usted puede write your own rules in FxCop, entonces tal vez esa sea una opción.

Sin embargo, en este caso, para la base de código existente, puede encontrar que una Ctrl-F (Buscar) en su editor para "ConfigurationManager.AppSettings" podría hacer un trabajo igualmente bueno con mucho menos esfuerzo ... Con respecto para futura aplicación aunque podría considerar una ruta más humana de una nota de correo electrónico para el equipo de desarrollo ...

Como destacó un comentarista anterior y vale la pena señalar para otros con objetivos similares, es que si esto se refería a una función en su propia base de código (que esta pregunta es que no se refiere a), puede usar el atributo [Obsolete].

+0

Si bien acepto que un correo electrónico ** debería ** funcionar, me gustaría algo un poco más concreto en términos de validación. – slolife

+1

¿Quizás le digan al equipo que le deben un paquete de 6 cervezas al resto del equipo por romper los estándares de codificación? Con toda seriedad, FxCop con una regla personalizada te ayudará a validarlo, pero eso es solo mientras el desarrollador (o un servidor de compilación) instale la regla (s) y use FxCop correctamente ... – Reddog

Cuestiones relacionadas