Como posso aplicar o aspecto postsharp a um projeto de site?

Nov 27 2020

Eu uso um postsharp.configarquivo simples :

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.postsharp.org/1.0/configuration">
  <Multicast xmlns:my="clr-namespace:ExceptionAutoSerializer.Aspects;assembly:ExceptionAutoSerializer">
    <my:MethodBoundaryAspect  AttributeTargetTypes="MyTopLevelNamespace.*" />
    <my:MethodBoundaryAspect  AttributeTargetMembers="*ctor*" AttributeExclude="true"/>
    <my:MethodBoundaryAspect  AttributeTargetMembers="get_*" AttributeExclude="true"/>
    <my:MethodBoundaryAspect  AttributeTargetMembers="set_*" AttributeExclude="true"/>
  </Multicast>
</Project>

Todos os meus projetos em minha solução estão sob o namespace MyTopLevelNamespace. E cada projeto na solução tem o aspecto aplicado a ele corretamente, exceto para o projeto do meu site. Não estou familiarizado com a solução, pois acabei de entrar na equipe de desenvolvimento.

Tudo que sei é que gostaria de aplicar o aspecto às classes dentro deste projeto e que o postsharp parece ignorar esse projeto específico. O arquivo de configuração está localizado na src/pasta e deve ser aplicado a todos os projetos.

Eu me certifiquei de que os tipos aos quais estou aplicando meu aspecto estão no namespace especificado no arquivo de configuração e que ele não corresponde a nenhum dos padrões de exclusão.

Forneci informações suficientes? Não tenho certeza se é devido ao projeto ser um projeto de site, mas não consigo ver mais nada.

Edit : Tenho certeza de que adicionei o pacote nuget ao projeto. Também tentei adicionar manualmente o aspecto com um atributo a um método específico deste projeto e o aspecto não dispara.

Edit2 : este é o método que utilizo para testar:

[MethodBoundaryAspect]
public bool Foo(string bar1, string bar2)
{
            // at runtime test contains indeed one attribute MethodBoundaryAspect
            var test = this.GetType().GetMethod("ValidateUser").GetCustomAttributes(false);
            //here the exception is caught higher up but the "onException" of my attribute doesn't trigger
            throw new Exception("test exception");
}

e meu aspecto pós-afiado:

namespace ExceptionAutoSerializer.Aspects
{
    [Serializable]
    public class MethodBoundaryAspect : OnMethodBoundaryAspect
    {

        //[...]

        public override void OnEntry(MethodExecutionArgs args)
        {
            //[...]
        }

        public override void OnSuccess(MethodExecutionArgs args)
        {
            //[...]
        }

        public override void OnException(MethodExecutionArgs args)
        {
            //[...]
        }
    }
}

Respostas

3 Amon Nov 30 2020 at 21:27

De acordo com uma resposta antiga de um desenvolvedor da PostSharp Technologies:

PostSharp é (atualmente) integrado via MSBuild (como também mencionado por John Saunders), que não é usado por projetos de website.

Embora em seu núcleo o PostSharp seja uma ferramenta de linha de comando, ele obtém tantas informações do MSBuild que é muito difícil fazê-lo funcionar separadamente (e nem aconselhado, nem documentado, nem suportado em primeiro lugar). Daniel Balas

Não encontrei nenhuma atualização sobre esse assunto para a versão anterior a 4.3. Para 4.3 e anteriores de acordo com a resposta anterior e esta documentação (pág. 45), o projeto de site não é compatível.

Editar : ao questionar o autor anteriormente citado sobre a validade atual de eles respondem eles responderam esta no comentário:

@Amon Para sites sem projeto (que IIRC não podem ser criados a partir da IU no VS 2017 e posterior), ainda é verdade. No entanto, todos os projetos da web que possuem csproj / vbproj (.NET ou .NET Core) estão funcionando conforme o esperado (isso também não mudou desde então). - Daniel Balas