Fody sucks :)

This commit is contained in:
Alex
2025-06-06 17:44:10 +01:00
parent 85014c1ec5
commit be7e0aea2d
15 changed files with 195 additions and 41 deletions
@@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<Reference Include="Ceciler.Interfaces">
<HintPath>..\..\Ceciler\Ceciler.Interfaces.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Mono.Cecil" Version="0.11.6" >
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
</Project>
@@ -0,0 +1,78 @@
using Ceciler.Interfaces;
using Mono.Cecil;
namespace Ceciler.Virtualizer;
public class VirtualizerPatch : IPatcher
{
public void Patch(ModuleDefinition module)
{
foreach (var typeDefinition in module.Types)
{
foreach (var typeDefinitionMethod in typeDefinition.Methods)
{
if (typeDefinitionMethod == null)
{
continue;
}
if (typeDefinitionMethod.IsConstructor)
{
continue;
}
if (typeDefinitionMethod.IsFinal && typeDefinitionMethod.IsVirtual)
{
typeDefinitionMethod.IsFinal = false;
continue;
}
if (typeDefinitionMethod.IsFinal)
{
continue;
}
if (typeDefinitionMethod.IsVirtual)
{
continue;
}
if (typeDefinitionMethod.IsStatic)
{
continue;
}
if (typeDefinitionMethod.IsPrivate)
{
continue;
}
if (MethodIsSerializationCallback(typeDefinitionMethod))
{
continue;
}
typeDefinitionMethod.IsVirtual = true;
typeDefinitionMethod.IsNewSlot = true;
}
}
module.Write();
}
static bool MethodIsSerializationCallback(MethodDefinition method)
{
return ContainsAttribute(method.CustomAttributes, "OnSerializingAttribute")
|| ContainsAttribute(method.CustomAttributes, "OnSerializedAttribute")
|| ContainsAttribute(method.CustomAttributes, "OnDeserializingAttribute")
|| ContainsAttribute(method.CustomAttributes, "OnDeserializedAttribute");
}
public static bool ContainsAttribute(IEnumerable<CustomAttribute> attributes, string attributeName) =>
attributes.Any(attribute => attribute.Constructor.DeclaringType.Name == attributeName);
public string Name
{
get { return "Virtualizer"; }
}
}