Skip to content

Commit 8d22187

Browse files
authored
fix: INetworkMessageILPP failing to output registration code for network messages (#2256)
* fix Resolves the issue where NetworkMessageILPP was failing for users using different API Compatibility Settings.
1 parent ad633b2 commit 8d22187

File tree

3 files changed

+46
-53
lines changed

3 files changed

+46
-53
lines changed

com.unity.netcode.gameobjects/Editor/CodeGen/CodeGenHelpers.cs

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -398,20 +398,21 @@ public static AssemblyDefinition AssemblyDefinitionFor(ICompiledAssembly compile
398398
return assemblyDefinition;
399399
}
400400

401-
public static (ModuleDefinition DotnetModule, ModuleDefinition UnityModule, ModuleDefinition NetcodeModule) FindBaseModules(AssemblyDefinition assemblyDefinition, PostProcessorAssemblyResolver assemblyResolver)
401+
private static void SearchForBaseModulesRecursive(AssemblyDefinition assemblyDefinition, PostProcessorAssemblyResolver assemblyResolver, ref ModuleDefinition unityModule, ref ModuleDefinition netcodeModule, HashSet<string> visited)
402402
{
403-
ModuleDefinition dotnetModule = null;
404-
ModuleDefinition unityModule = null;
405-
ModuleDefinition netcodeModule = null;
406403

407404
foreach (var module in assemblyDefinition.Modules)
408405
{
409-
if (dotnetModule == null && module.Name == DotnetModuleName)
406+
if (module == null)
410407
{
411-
dotnetModule = module;
412408
continue;
413409
}
414410

411+
if (unityModule != null && netcodeModule != null)
412+
{
413+
return;
414+
}
415+
415416
if (unityModule == null && module.Name == UnityModuleName)
416417
{
417418
unityModule = module;
@@ -424,41 +425,46 @@ public static (ModuleDefinition DotnetModule, ModuleDefinition UnityModule, Modu
424425
continue;
425426
}
426427
}
427-
428-
if (dotnetModule != null && unityModule != null && netcodeModule != null)
428+
if (unityModule != null && netcodeModule != null)
429429
{
430-
return (dotnetModule, unityModule, netcodeModule);
430+
return;
431431
}
432432

433433
foreach (var assemblyNameReference in assemblyDefinition.MainModule.AssemblyReferences)
434434
{
435-
foreach (var module in assemblyResolver.Resolve(assemblyNameReference).Modules)
435+
if (assemblyNameReference == null)
436436
{
437-
if (dotnetModule == null && module.Name == DotnetModuleName)
438-
{
439-
dotnetModule = module;
440-
continue;
441-
}
442-
if (unityModule == null && module.Name == UnityModuleName)
443-
{
444-
unityModule = module;
445-
continue;
446-
}
437+
continue;
438+
}
439+
if (visited.Contains(assemblyNameReference.Name))
440+
{
441+
continue;
442+
}
447443

448-
if (netcodeModule == null && module.Name == NetcodeModuleName)
449-
{
450-
netcodeModule = module;
451-
continue;
452-
}
444+
visited.Add(assemblyNameReference.Name);
445+
446+
var assembly = assemblyResolver.Resolve(assemblyNameReference);
447+
if (assembly == null)
448+
{
449+
continue;
453450
}
451+
SearchForBaseModulesRecursive(assembly, assemblyResolver, ref unityModule, ref netcodeModule, visited);
454452

455-
if (dotnetModule != null && unityModule != null && netcodeModule != null)
453+
if (unityModule != null && netcodeModule != null)
456454
{
457-
return (dotnetModule, unityModule, netcodeModule);
455+
return;
458456
}
459457
}
458+
}
459+
460+
public static (ModuleDefinition UnityModule, ModuleDefinition NetcodeModule) FindBaseModules(AssemblyDefinition assemblyDefinition, PostProcessorAssemblyResolver assemblyResolver)
461+
{
462+
ModuleDefinition unityModule = null;
463+
ModuleDefinition netcodeModule = null;
464+
var visited = new HashSet<string>();
465+
SearchForBaseModulesRecursive(assemblyDefinition, assemblyResolver, ref unityModule, ref netcodeModule, visited);
460466

461-
return (dotnetModule, unityModule, netcodeModule);
467+
return (unityModule, netcodeModule);
462468
}
463469
}
464470
}

com.unity.netcode.gameobjects/Editor/CodeGen/INetworkMessageILPP.cs

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,7 @@ public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly)
3838
}
3939

4040
// modules
41-
(m_DotnetModule, _, m_NetcodeModule) = CodeGenHelpers.FindBaseModules(assemblyDefinition, m_AssemblyResolver);
42-
43-
if (m_DotnetModule == null)
44-
{
45-
m_Diagnostics.AddError($"Cannot find .NET module: {CodeGenHelpers.DotnetModuleName}");
46-
return null;
47-
}
41+
(_, m_NetcodeModule) = CodeGenHelpers.FindBaseModules(assemblyDefinition, m_AssemblyResolver);
4842

4943
if (m_NetcodeModule == null)
5044
{
@@ -104,7 +98,6 @@ public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly)
10498
return new ILPostProcessResult(new InMemoryAssembly(pe.ToArray(), pdb.ToArray()), m_Diagnostics);
10599
}
106100

107-
private ModuleDefinition m_DotnetModule;
108101
private ModuleDefinition m_NetcodeModule;
109102
private PostProcessorAssemblyResolver m_AssemblyResolver;
110103

@@ -121,22 +114,16 @@ public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly)
121114

122115
private bool ImportReferences(ModuleDefinition moduleDefinition)
123116
{
124-
TypeDefinition typeTypeDef = null;
125-
TypeDefinition listTypeDef = null;
126-
foreach (var dotnetTypeDef in m_DotnetModule.GetAllTypes())
127-
{
128-
if (typeTypeDef == null && dotnetTypeDef.Name == typeof(Type).Name)
129-
{
130-
typeTypeDef = dotnetTypeDef;
131-
continue;
132-
}
133-
134-
if (listTypeDef == null && dotnetTypeDef.Name == typeof(List<>).Name)
135-
{
136-
listTypeDef = dotnetTypeDef;
137-
continue;
138-
}
139-
}
117+
// Different environments seem to have different situations...
118+
// Some have these definitions in netstandard.dll...
119+
// some seem to have them elsewhere...
120+
// Since they're standard .net classes they're not going to cause
121+
// the same issues as referencing other assemblies, in theory, since
122+
// the definitions should be standard and consistent across platforms
123+
// (i.e., there's no #if UNITY_EDITOR in them that could create
124+
// invalid IL code)
125+
TypeDefinition typeTypeDef = moduleDefinition.ImportReference(typeof(Type)).Resolve();
126+
TypeDefinition listTypeDef = moduleDefinition.ImportReference(typeof(List<>)).Resolve();
140127

141128
TypeDefinition messageHandlerTypeDef = null;
142129
TypeDefinition messageWithHandlerTypeDef = null;

com.unity.netcode.gameobjects/Editor/CodeGen/NetworkBehaviourILPP.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly)
4444
}
4545

4646
// modules
47-
(_, m_UnityModule, m_NetcodeModule) = CodeGenHelpers.FindBaseModules(assemblyDefinition, m_AssemblyResolver);
47+
(m_UnityModule, m_NetcodeModule) = CodeGenHelpers.FindBaseModules(assemblyDefinition, m_AssemblyResolver);
4848

4949
if (m_UnityModule == null)
5050
{

0 commit comments

Comments
 (0)