ポストシャープアスペクトをWebサイトプロジェクトに適用するにはどうすればよいですか?

Nov 27 2020

私は単純なpostsharp.configファイルを使用します:

<?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>

ソリューション内のすべてのプロジェクトは、名前空間の下にありますMyTopLevelNamespace。そして、ソリューション内のすべてのプロジェクトには、私のWebサイトプロジェクトを除いて、アスペクトが正しく適用されています。私は開発チームに入ったばかりなので、ソリューションに精通していません。

私が知っているのは、このプロジェクト内のクラスにアスペクトを適用したいということと、postsharpがその特定のプロジェクトを無視しているように見えることだけです。構成ファイルはsrc/フォルダーにあり、すべてのプロジェクトに適用する必要があります。

アスペクトを適用するタイプが構成ファイルで指定された名前空間の下にあり、除外パターンのいずれとも一致しないことを確認しました。

十分な情報を提供しましたか?プロジェクトがウェブサイトプロジェクトになっていることが原因かどうかはわかりませんが、他に何も表示されません。

編集:プロジェクトにnugetパッケージを追加したことを確認しました。また、属性を持つアスペクトをこのプロジェクトの特定のメソッドに手動で追加しようとしましたが、アスペクトがトリガーされません。

Edit2:これは私がテストするために使用する方法です:

[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");
}

と私のポストシャープの側面:

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)
        {
            //[...]
        }
    }
}

回答

3 Amon Nov 30 2020 at 21:27

PostSharp Technologiesの開発者の古い回答によると:

PostSharpは(現在)MSBuild(John Saundersでも言及されている)を介して統合されており、Webサイトプロジェクトでは使用されていません。

コアとなるPostSharpはコマンドラインツールですが、MSBuildから多くの情報を取得するため、個別に機能させるのは非常に困難です(そもそも、アドバイスも文書化もサポートもされていません)。ダニエルバラス

4.3より古いバージョンのその件に関する更新は見つかりませんでした。前の回答とこのドキュメント(p。45)によると、4.3以前では、Webサイトプロジェクトはサポートされていません。

編集:彼らが答える現在の妥当性について以前に引用された著者に質問するとき、彼らはコメントでこれに答えました:

@AmonプロジェクトのないWebサイト(IIRCはVS 2017以降のUIから作成できません)の場合、それは依然として当てはまります。ただし、csproj / vbproj(.NETまたは.NET Core)を持つすべてのWebプロジェクトは期待どおりに機能しています(これもそれ以降変更されていません)。–ダニエルバラス