Pregunta

Estoy trabajando con PostSharp para interceptar llamadas a métodos de objetos no tengo, pero mi aspecto código no parece estar recibiendo llamadas.La documentación parece bastante laxa en los Silverlight área, por lo que agradecería cualquier ayuda de ustedes puede ofrecer :)

Tengo un atributo que parece:

public class LogAttribute : OnMethodInvocationAspect
{
    public override void OnInvocation(MethodInvocationEventArgs eventArgs)
    {
        // Logging code goes here...
    }
}

Y una entrada en mi AssemblyInfo que parece:

[assembly: Log(AttributeTargetAssemblies = "System.Windows", AttributeTargetTypes = "System.Windows.Controls.*")]

Así que mi pregunta para usted es...lo que me estoy perdiendo?Llamadas al método en virtud de la coincidencia de atributo objetivos no parecen funcionar.

¿Fue útil?

Solución

Esto no es posible con la versión actual de PostSharp.

PostSharp trabaja por la transformación de las asambleas antes de ser cargado por el CLR.Ahora, para hacer eso, tienen que darse dos condiciones:

  • La asamblea debe estar a punto de ser cargado en el CLR;usted sólo tiene una oportunidad, y usted tiene que tomar en este momento.
  • Después de la fase de transformación se ha terminado, usted no puede hacer modificaciones adicionales.Eso significa que usted no puede modificar el ensamblado en tiempo de ejecución.

La versión más reciente, 1.5 CTP 3, quita la primera de estas dos limitaciones, pero es el segundo que realmente el problema.Esta es, sin embargo, una gran característica solicitada, así que mantén los ojos bien abiertos:

Los usuarios preguntan a menudo si es posible utilizar PostSharp en tiempo de ejecución, por lo que los aspectos no tiene que ser conocido en tiempo de compilación.Aspectos cambiantes después de la implementación es de hecho una gran ventaja, ya que permiten que el personal de apoyo para habilitar/deshabilitar el seguimiento o monitoreo del desempeño para piezas individuales de software. Una de las cosas interesantes que permitiría que es la aplicación de los aspectos de terceros asambleas.

Si usted pregunta si es posible, la respuesta corta es sí! Por desgracia, el tiempo de respuesta es más compleja.

Tiempo de ejecución de tercer aspecto trampas

Asimismo, el autor procede a esbozar algunos de los problemas que ocurren cuando permiten la modificación en tiempo de ejecución:

Así que ahora, ¿cuáles son los errores?

  • Conectar el arranque. Si el código está alojado (por ejemplo en ASP.RED o en un servidor COM), que no pueden tapar el arranque.Por lo que cualquier tiempo de ejecución de tejido de la tecnología está obligado a la limitación que se debe host la aplicación a sí mismo.
  • Antes de que la CLR. Si el CLR encuentra las no transformadas de la asamblea por su propia cuenta, no va a pedir la transformada uno.Así que usted puede necesitar para crear una nueva dominio de la aplicación para la transformación de los aplicación, y poner transformado asambleas en su ruta de acceso binario.Es tal vez no es un gran problema.
  • Fuerte nombres. Ough.Si modifica un ensamblado en tiempo de ejecución, tendrá que quitar su nombre seguro.¿Funcionará?Sí, la mayoría.Por supuesto, usted tiene que quitar el fuerte los nombres de todos los las referencias a esta asamblea.Que no es un problema;PostSharp lo soporta out-of-the-box.Pero hay algo PostSharp no puede ayudar con:si no son algunos fuertemente referencias con nombre en las cadenas o los archivos (por ejemplo, en app.config), difícilmente podemos encontrar y transformarlos.Así que aquí tenemos un limitación:no puede ser "las referencias" a fuertemente nombre asambleas:que sólo son capaces de transformar referencias reales.
  • LoadFrom. Si cualquier asamblea de los usos de la Asamblea.LoadFrom, De La Asamblea.LoadFile o de la Asamblea.LoadBytes, nuestro de arranque se omite.

Otros consejos

Yo creo que si cambia AttributeTargetAssemblies a "PresentationFramework", podría funcionar.(No tiene PostSharp abajo que bien todavía).

La Asamblea de WPF es PresentationFramework.dll.El AttributeTargetAssemblies necesidades de la dll que se debe de destino.

PostSharp tiene una nueva versión, a la que se accede desde la página de Descargas de enlace a "Todas las Descargas".

PostSharp 1.5 La rama de desarrollo de PostSharp incluyendo nuevas características como soporte para el Mono, Compact Framework o Silverlight, y el aspecto de la herencia.La descarga de esta rama, si quieres probar las nuevas características y ayudar a la comunidad de pruebas de nuevos desarrollos, y puede aceptar la menor fiabilidad y la estabilidad de APIes.

La versión que está actualmente en el 1,5 CTP 3 pero tiene soporte para Silverlight.

Si usted está tratando de interceptar llamadas en el marco (es decir, no en su propio código), no va a funcionar.PostSharp sólo puede reemplazar el código dentro de su propia asamblea.Si usted está tratando de interceptar las llamadas que usted está haciendo, entonces me parece que debería funcionar.¿Ves PostSharp que se ejecutan en la salida de la compilación?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top