Below you will find pages that utilize the taxonomy term “Fody”
Posts
MethodBoundaryAspect.Fody - Altering asynchronous method behavior
MethodBoundaryAspect.Fody 要修改非同步方法的回傳值,可在 OnExit 方法實作時將 MethodExecutionArgs.ReturnValue 屬性值轉回 Task,用 ContinueWith 串接處理,並將之塞回 MethodExecutionArgs.ReturnValue。
if (args.ReturnValue is Task<...> t) { args.ReturnValue = t.ContinueWith(...); } 像是如果要撰寫一個可將方法回傳值變大寫的 Attribute 的話,可像下面這樣撰寫。
using System.Threading.Tasks; using MethodBoundaryAspect.Fody.Attributes; namespace MethodBoundaryAspect.Fody.Demo { public sealed class UpperAttribute : OnMethodBoundaryAspect { public override void OnExit(MethodExecutionArgs args) { if (args.ReturnValue is Task<string> t) { args.ReturnValue = t.ContinueWith(task => t.Result.ToUpper()); } else { args.ReturnValue = (args.ReturnValue as string).ToUpper(); } } } } 在要做大寫轉換的方法上加掛 Attribute。
using System; using System.
read morePosts
MethodBoundaryAspect.Fody - Altering method behavior
MethodBoundaryAspect.Fody 要修改方法的回傳值,可在 OnExit 方法實作時透過 MethodExecutionArgs.ReturnValue 屬性填入新的方法值。
像是如果要撰寫一個可將方法回傳值變大寫的 Attribute 的話,可像下面這樣撰寫。
using MethodBoundaryAspect.Fody.Attributes; namespace MethodBoundaryAspect.Fody.Demo { public sealed class UpperAttribute : OnMethodBoundaryAspect { public override void OnExit(MethodExecutionArgs args) { args.ReturnValue = (args.ReturnValue as string).ToUpper(); } } } 在要做大寫轉換的方法上加掛 Attribute。
using System; namespace MethodBoundaryAspect.Fody.Demo { class Program { [Log] static void Main(string[] args) { Console.WriteLine(GetData()); } [Upper] static string GetData() { return "hello world!"; } } } 程式在編譯時即會加掛對應的處理,方法運行後可看到回傳值會被轉為大寫。
read morePosts
MethodBoundaryAspect.Fody - A Fody weaver which allows to decorate methods and hook into method start, method end and method exceptions
MethodBoundaryAspect.Fody 能透過 Fody 在程式編譯時將進出方法與方法丟出錯誤時的處理掛入系統中。
使用時需先引用 MethodBoundaryAspect.Fody 套件。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="MethodBoundaryAspect.Fody" Version="2.0.113" /> </ItemGroup> </Project> 然後加入 FodyWeavers.xml 檔,指示 Fody 要使用 MethodBoundaryAspect。
<?xml version="1.0" encoding="utf-8"?> <Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> <MethodBoundaryAspect /> </Weavers> 接著開一個 Attribute 類別繼承 OnMethodBoundaryAspect,在 OnEntry 撰寫方法進入時的處理、OnExit 撰寫方法離開時的處理、OnException 撰寫方法發生例外時的處理。
using System; using MethodBoundaryAspect.Fody.Attributes; namespace MethodBoundaryAspect.Fody.Demo { public sealed class LogAttribute : OnMethodBoundaryAspect { public override void OnEntry(MethodExecutionArgs args) { Console.WriteLine("OnEntry..."); } public override void OnExit(MethodExecutionArgs args) { Console.
read morePosts
ModuleInit.Fody - Adds a module initializer to an assembly
ModuleInit.Fody 能透過 Fody 在程式編譯時將初始化處理掛入系統程式中,能在系統一開始運行時做初始的動作。
使用時需先引用 ModuleInit.Fody 套件。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="ModuleInit.Fody" Version="2.0.0" PrivateAssets="All" /> </ItemGroup> </Project> 然後加入 FodyWeavers.xml 檔,檔案內容如下,指示 Fody 要使用 ModuleInit。
<?xml version="1.0" encoding="utf-8"?> <Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> <ModuleInit /> </Weavers> 接著在 ModuleInitializer 的 Initialize 方法撰寫初始化的部分。
運行後可看到程式會在啟動時先運行初始化程式。
Link Fody/ModuleInit: Adds a module initializer to an assembly
read morePosts
MethodTimer.Fody - Injects some very basic method timing code
MethodTimer.Fody 能透過 Fody 在程式編譯時將用來計算時間的程式放入掛有 TimeAttribute 的方法。
使用時需先引用 MethodTimer.Fody 套件。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="MethodTimer.Fody" Version="3.0.0" PrivateAssets="All" /> </ItemGroup> </Project> 然後加入 FodyWeavers.xml 檔,檔案內容如下,指示 Fody 要使用 MethodTimer。
<?xml version="1.0" encoding="utf-8"?> <Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd"> <MethodTimer /> </Weavers> 接著在 MethodTimeLogger 的 Log 方法撰寫時間計算的部分。
using System; using System.Reflection; namespace Fody.MethodTimer { public static class MethodTimeLogger { public static void Log(MethodBase methodBase, long milliseconds, string message) { Console.WriteLine($"[{methodBase.DeclaringType.Name}.{methodBase.Name}] {message} {milliseconds} ms"); } } } 然後在要計算時間的部分加掛 TimeAttribute,TimeAttribute 可掛在方法、類別、模組上,掛上時可順帶帶入對應的訊息。
read more