mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 13:41:03 +00:00 
			
		
		
		
	C#: Begin move to .NET Core
We're targeting .NET 5 for now to make development easier while .NET 6 is not yet released. TEMPORARY REGRESSIONS --------------------- Assembly unloading is not implemented yet. As such, many Godot resources are leaked at exit. This will be re-implemented later together with assembly hot-reloading.
This commit is contained in:
		
							parent
							
								
									513ee857a9
								
							
						
					
					
						commit
						f9a67ee9da
					
				
					 96 changed files with 2475 additions and 5615 deletions
				
			
		|  | @ -0,0 +1,61 @@ | |||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
| using System.Runtime.Loader; | ||||
| 
 | ||||
| namespace GodotPlugins | ||||
| { | ||||
|     public class PluginLoadContext : AssemblyLoadContext | ||||
|     { | ||||
|         private readonly AssemblyDependencyResolver _resolver; | ||||
|         private readonly ICollection<string> _sharedAssemblies; | ||||
|         private readonly AssemblyLoadContext _mainLoadContext; | ||||
| 
 | ||||
|         public PluginLoadContext(string pluginPath, ICollection<string> sharedAssemblies, | ||||
|             AssemblyLoadContext mainLoadContext) | ||||
|         { | ||||
|             Console.WriteLine(pluginPath); | ||||
|             Console.Out.Flush(); | ||||
|             _resolver = new AssemblyDependencyResolver(pluginPath); | ||||
|             _sharedAssemblies = sharedAssemblies; | ||||
|             _mainLoadContext = mainLoadContext; | ||||
|         } | ||||
| 
 | ||||
|         protected override Assembly? Load(AssemblyName assemblyName) | ||||
|         { | ||||
|             if (assemblyName.Name == null) | ||||
|                 return null; | ||||
| 
 | ||||
|             if (_sharedAssemblies.Contains(assemblyName.Name)) | ||||
|                 return _mainLoadContext.LoadFromAssemblyName(assemblyName); | ||||
| 
 | ||||
|             string? assemblyPath = _resolver.ResolveAssemblyToPath(assemblyName); | ||||
|             if (assemblyPath != null) | ||||
|             { | ||||
|                 // Load in memory to prevent locking the file | ||||
|                 using var assemblyFile = File.Open(assemblyPath, FileMode.Open, FileAccess.Read, FileShare.Read); | ||||
|                 string pdbPath = Path.ChangeExtension(assemblyPath, ".pdb"); | ||||
| 
 | ||||
|                 if (File.Exists(pdbPath)) | ||||
|                 { | ||||
|                     using var pdbFile = File.Open(pdbPath, FileMode.Open, FileAccess.Read, FileShare.Read); | ||||
|                     return LoadFromStream(assemblyFile, pdbFile); | ||||
|                 } | ||||
| 
 | ||||
|                 return LoadFromStream(assemblyFile); | ||||
|             } | ||||
| 
 | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         protected override IntPtr LoadUnmanagedDll(string unmanagedDllName) | ||||
|         { | ||||
|             string? libraryPath = _resolver.ResolveUnmanagedDllToPath(unmanagedDllName); | ||||
|             if (libraryPath != null) | ||||
|                 return LoadUnmanagedDllFromPath(libraryPath); | ||||
| 
 | ||||
|             return IntPtr.Zero; | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Ignacio Roldán Etcheverry
						Ignacio Roldán Etcheverry