public void OnPostBuildPlayerScriptDLLs(BuildReport report) { // This is a bit hacky - we need actual references, not directories, containing references, so we pass folder/dummy.dll // knowing that dummy.dll will be stripped. var systemAssemblies = CompilationPipeline.GetSystemAssemblyDirectories(ApiCompatibilityLevel.NET_Standard_2_0).Select(d => Path.Combine(d, "dummy.dll")); var referencePaths = systemAssemblies .Concat(report.files.Select(f => f.path)) .ToArray(); var assembliesToWeave = report.files.Where(f => f.role == "ManagedLibrary"); foreach (var file in assembliesToWeave) { WeaveAssemblyCore(file.path, referencePaths); } if (report.summary.platform == BuildTarget.iOS) { var realmAssemblyPath = report.files .SingleOrDefault(r => "Realm.dll".Equals(Path.GetFileName(r.path), StringComparison.OrdinalIgnoreCase)) .path; var realmResolutionResult = WeaverAssemblyResolver.Resolve(realmAssemblyPath, referencePaths); using (realmResolutionResult) { var wrappersReference = realmResolutionResult.Module.ModuleReferences.SingleOrDefault(r => r.Name == "realm-wrappers"); if (wrappersReference != null) { wrappersReference.Name = "__Internal"; realmResolutionResult.SaveModuleUpdates(); } } } }
private static bool WeaveAssemblyCore(string assemblyPath, IEnumerable <string> references) { var name = Path.GetFileNameWithoutExtension(assemblyPath); try { var timer = new Stopwatch(); timer.Start(); var resolutionResult = WeaverAssemblyResolver.Resolve(assemblyPath, references); if (resolutionResult == null) { return(false); } using (resolutionResult) { // Unity doesn't add the [TargetFramework] attribute when compiling the assembly. However, it's // using NETStandard2, so we just hardcode this. var weaver = new Weaver(resolutionResult.Module, UnityLogger.Instance, new FrameworkName(".NETStandard,Version=v2.0")); var results = weaver.Execute(); // Unity creates an entry in the build console for each item, so let's not pollute it. if (results.SkipReason == null) { resolutionResult.SaveModuleUpdates(); UnityLogger.Instance.Info($"[{name}] Weaving completed in {timer.ElapsedMilliseconds} ms.{Environment.NewLine}{results}"); return(true); } } } catch (Exception ex) { UnityLogger.Instance.Warning($"[{name}] Weaving failed: {ex}"); } return(false); }