Skip to content

Commit 76e1e64

Browse files
committed
replace NetcodePatcher attribute with an attribute patched into the assembly
1 parent d6ea019 commit 76e1e64

File tree

3 files changed

+42
-14
lines changed

3 files changed

+42
-14
lines changed

NetcodePatcher/Attributes/NetcodePatchedAssemblyAttribute.cs

Lines changed: 0 additions & 8 deletions
This file was deleted.

NetcodePatcher/CodeGen/ApplyPatchedAttributeILPP.cs

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
using System;
22
using System.Collections.Generic;
33
using System.IO;
4+
using System.Linq;
45
using Mono.Cecil;
56
using Mono.Cecil.Cil;
6-
using NetcodePatcher.Attributes;
7+
using Mono.Cecil.Rocks;
78
using Unity.CompilationPipeline.Common.Diagnostics;
89
using Unity.CompilationPipeline.Common.ILPostProcessing;
910
using Unity.Netcode.Editor.CodeGen;
11+
using MethodAttributes = Mono.Cecil.MethodAttributes;
12+
using TypeAttributes = Mono.Cecil.TypeAttributes;
1013

1114
namespace NetcodePatcher.CodeGen;
1215

1316
public class ApplyPatchedAttributeILPP : ILPostProcessor
1417
{
18+
public static readonly string AttributeNamespaceSuffix = "NetcodePatcher";
19+
20+
public static readonly string AttributeName = "NetcodePatchedAssemblyAttribute";
21+
1522
public override ILPostProcessor GetInstance() => this;
1623

1724
public override bool WillProcess(ICompiledAssembly compiledAssembly) => true;
@@ -34,9 +41,38 @@ public class ApplyPatchedAttributeILPP : ILPostProcessor
3441
}
3542

3643
// do stuff
37-
var attributeConstructor =
44+
var patchedAttributeDefinition = new TypeDefinition(
45+
$"{assemblyDefinition.Name.Name}.{AttributeNamespaceSuffix}",
46+
AttributeName,
47+
TypeAttributes.NestedPrivate,
48+
assemblyDefinition.MainModule.ImportReference(typeof(Attribute))
49+
);
50+
51+
var attributeUsageAttributeConstructor =
3852
assemblyDefinition.MainModule.ImportReference(
39-
typeof(NetcodePatchedAssemblyAttribute).GetConstructor(Type.EmptyTypes));
53+
typeof(AttributeUsageAttribute).GetConstructor([typeof(AttributeTargets)])
54+
);
55+
var attributeUsageAttribute = new CustomAttribute(attributeUsageAttributeConstructor);
56+
attributeUsageAttribute.ConstructorArguments.Add(
57+
new CustomAttributeArgument(assemblyDefinition.MainModule.ImportReference(typeof(AttributeTargets)), AttributeTargets.Assembly)
58+
);
59+
patchedAttributeDefinition.CustomAttributes.Add(attributeUsageAttribute);
60+
61+
var methodAttributes = MethodAttributes.Assembly | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName;
62+
var method = new MethodDefinition(".ctor", methodAttributes, assemblyDefinition.MainModule.TypeSystem.Void);
63+
method.Body.Instructions.Add(Instruction.Create(OpCodes.Ldarg_0));
64+
var baseCtorReference = new MethodReference(".ctor", assemblyDefinition.MainModule.TypeSystem.Void, patchedAttributeDefinition.BaseType){HasThis = true};
65+
method.Body.Instructions.Add(Instruction.Create(OpCodes.Call, baseCtorReference));
66+
method.Body.Instructions.Add(Instruction.Create(OpCodes.Ret));
67+
patchedAttributeDefinition.Methods.Add(method);
68+
69+
assemblyDefinition.MainModule.Types.Add(patchedAttributeDefinition);
70+
71+
var attributeConstructor = assemblyDefinition.MainModule
72+
.ImportReference(patchedAttributeDefinition)
73+
.Resolve()
74+
.GetConstructors()
75+
.First();
4076
var attribute = new CustomAttribute(attributeConstructor);
4177
assemblyDefinition.CustomAttributes.Add(attribute);
4278

NetcodePatcher/CodeGen/ILPostProcessorFromFile.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.IO;
33
using System.Linq;
44
using Mono.Cecil;
5-
using NetcodePatcher.Attributes;
65
using Serilog;
76
using Unity.CompilationPipeline.Common.Diagnostics;
87
using Unity.CompilationPipeline.Common.ILPostProcessing;
@@ -12,14 +11,15 @@ namespace NetcodePatcher.CodeGen;
1211

1312
public static class ILPostProcessorFromFile
1413
{
15-
1614
public static bool HasNetcodePatchedAttribute(ICompiledAssembly assembly)
1715
{
1816
// read
1917
AssemblyDefinition? assemblyDefinition = CodeGenHelpers.AssemblyDefinitionFor(assembly, out _);
2018
if (assemblyDefinition == null) return false;
2119

22-
return assemblyDefinition.CustomAttributes.Any(attribute => attribute.Constructor.DeclaringType.FullName == typeof(NetcodePatchedAssemblyAttribute).FullName);
20+
return assemblyDefinition.CustomAttributes.Any(
21+
attribute => attribute.Constructor.DeclaringType.FullName.EndsWith($".{ApplyPatchedAttributeILPP.AttributeNamespaceSuffix}.{ApplyPatchedAttributeILPP.AttributeName}")
22+
);
2323
}
2424

2525
public static void ILPostProcessFile(string assemblyPath, string outputPath, string[] references, Action<string> onWarning, Action<string> onError)

0 commit comments

Comments
 (0)