Fody sucks :)
This commit is contained in:
@@ -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"; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user