Skip to content

Commit

Permalink
fix: INetworkMessageILPP failing to output registration code for netw…
Browse files Browse the repository at this point in the history
…ork messages (Unity-Technologies#2256)

* fix
Resolves the issue where NetworkMessageILPP was failing for users using different API Compatibility Settings.
  • Loading branch information
ShadauxCat authored Oct 13, 2022
1 parent ad633b2 commit 8d22187
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 53 deletions.
62 changes: 34 additions & 28 deletions com.unity.netcode.gameobjects/Editor/CodeGen/CodeGenHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -398,20 +398,21 @@ public static AssemblyDefinition AssemblyDefinitionFor(ICompiledAssembly compile
return assemblyDefinition;
}

public static (ModuleDefinition DotnetModule, ModuleDefinition UnityModule, ModuleDefinition NetcodeModule) FindBaseModules(AssemblyDefinition assemblyDefinition, PostProcessorAssemblyResolver assemblyResolver)
private static void SearchForBaseModulesRecursive(AssemblyDefinition assemblyDefinition, PostProcessorAssemblyResolver assemblyResolver, ref ModuleDefinition unityModule, ref ModuleDefinition netcodeModule, HashSet<string> visited)
{
ModuleDefinition dotnetModule = null;
ModuleDefinition unityModule = null;
ModuleDefinition netcodeModule = null;

foreach (var module in assemblyDefinition.Modules)
{
if (dotnetModule == null && module.Name == DotnetModuleName)
if (module == null)
{
dotnetModule = module;
continue;
}

if (unityModule != null && netcodeModule != null)
{
return;
}

if (unityModule == null && module.Name == UnityModuleName)
{
unityModule = module;
Expand All @@ -424,41 +425,46 @@ public static (ModuleDefinition DotnetModule, ModuleDefinition UnityModule, Modu
continue;
}
}

if (dotnetModule != null && unityModule != null && netcodeModule != null)
if (unityModule != null && netcodeModule != null)
{
return (dotnetModule, unityModule, netcodeModule);
return;
}

foreach (var assemblyNameReference in assemblyDefinition.MainModule.AssemblyReferences)
{
foreach (var module in assemblyResolver.Resolve(assemblyNameReference).Modules)
if (assemblyNameReference == null)
{
if (dotnetModule == null && module.Name == DotnetModuleName)
{
dotnetModule = module;
continue;
}
if (unityModule == null && module.Name == UnityModuleName)
{
unityModule = module;
continue;
}
continue;
}
if (visited.Contains(assemblyNameReference.Name))
{
continue;
}

if (netcodeModule == null && module.Name == NetcodeModuleName)
{
netcodeModule = module;
continue;
}
visited.Add(assemblyNameReference.Name);

var assembly = assemblyResolver.Resolve(assemblyNameReference);
if (assembly == null)
{
continue;
}
SearchForBaseModulesRecursive(assembly, assemblyResolver, ref unityModule, ref netcodeModule, visited);

if (dotnetModule != null && unityModule != null && netcodeModule != null)
if (unityModule != null && netcodeModule != null)
{
return (dotnetModule, unityModule, netcodeModule);
return;
}
}
}

public static (ModuleDefinition UnityModule, ModuleDefinition NetcodeModule) FindBaseModules(AssemblyDefinition assemblyDefinition, PostProcessorAssemblyResolver assemblyResolver)
{
ModuleDefinition unityModule = null;
ModuleDefinition netcodeModule = null;
var visited = new HashSet<string>();
SearchForBaseModulesRecursive(assemblyDefinition, assemblyResolver, ref unityModule, ref netcodeModule, visited);

return (dotnetModule, unityModule, netcodeModule);
return (unityModule, netcodeModule);
}
}
}
35 changes: 11 additions & 24 deletions com.unity.netcode.gameobjects/Editor/CodeGen/INetworkMessageILPP.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,7 @@ public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly)
}

// modules
(m_DotnetModule, _, m_NetcodeModule) = CodeGenHelpers.FindBaseModules(assemblyDefinition, m_AssemblyResolver);

if (m_DotnetModule == null)
{
m_Diagnostics.AddError($"Cannot find .NET module: {CodeGenHelpers.DotnetModuleName}");
return null;
}
(_, m_NetcodeModule) = CodeGenHelpers.FindBaseModules(assemblyDefinition, m_AssemblyResolver);

if (m_NetcodeModule == null)
{
Expand Down Expand Up @@ -104,7 +98,6 @@ public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly)
return new ILPostProcessResult(new InMemoryAssembly(pe.ToArray(), pdb.ToArray()), m_Diagnostics);
}

private ModuleDefinition m_DotnetModule;
private ModuleDefinition m_NetcodeModule;
private PostProcessorAssemblyResolver m_AssemblyResolver;

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

private bool ImportReferences(ModuleDefinition moduleDefinition)
{
TypeDefinition typeTypeDef = null;
TypeDefinition listTypeDef = null;
foreach (var dotnetTypeDef in m_DotnetModule.GetAllTypes())
{
if (typeTypeDef == null && dotnetTypeDef.Name == typeof(Type).Name)
{
typeTypeDef = dotnetTypeDef;
continue;
}

if (listTypeDef == null && dotnetTypeDef.Name == typeof(List<>).Name)
{
listTypeDef = dotnetTypeDef;
continue;
}
}
// Different environments seem to have different situations...
// Some have these definitions in netstandard.dll...
// some seem to have them elsewhere...
// Since they're standard .net classes they're not going to cause
// the same issues as referencing other assemblies, in theory, since
// the definitions should be standard and consistent across platforms
// (i.e., there's no #if UNITY_EDITOR in them that could create
// invalid IL code)
TypeDefinition typeTypeDef = moduleDefinition.ImportReference(typeof(Type)).Resolve();
TypeDefinition listTypeDef = moduleDefinition.ImportReference(typeof(List<>)).Resolve();

TypeDefinition messageHandlerTypeDef = null;
TypeDefinition messageWithHandlerTypeDef = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly)
}

// modules
(_, m_UnityModule, m_NetcodeModule) = CodeGenHelpers.FindBaseModules(assemblyDefinition, m_AssemblyResolver);
(m_UnityModule, m_NetcodeModule) = CodeGenHelpers.FindBaseModules(assemblyDefinition, m_AssemblyResolver);

if (m_UnityModule == null)
{
Expand Down

0 comments on commit 8d22187

Please sign in to comment.