Skip to content

Commit 23653d6

Browse files
Improve assembly loading
1 parent 3584e10 commit 23653d6

File tree

7 files changed

+36
-14
lines changed

7 files changed

+36
-14
lines changed

api/AltV.Net.Host/Host.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ namespace AltV.Net.Host
88
{
99
public class Host
1010
{
11-
private static IDictionary<string, ResourceAssemblyLoadContext> _loadContexts = new Dictionary<string, ResourceAssemblyLoadContext>();
12-
11+
private static IDictionary<string, ResourceAssemblyLoadContext> _loadContexts =
12+
new Dictionary<string, ResourceAssemblyLoadContext>();
13+
1314
/// <summary>
1415
/// Main is present to execute the dll as a assembly
1516
/// </summary>
@@ -45,7 +46,7 @@ public static int ExecuteResource(IntPtr arg, int argLength)
4546
var resourceMain = Marshal.PtrToStringUTF8(libArgs.ResourceMain);
4647

4748
var resourceDllPath = GetPath(resourcePath, resourceMain);
48-
var resourceAssemblyLoadContext = new ResourceAssemblyLoadContext(resourceDllPath);
49+
var resourceAssemblyLoadContext = new ResourceAssemblyLoadContext(resourceDllPath, resourceName);
4950

5051
Assembly resourceAssembly;
5152

api/AltV.Net.Host/ResourceAssemblyLoadContext.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.IO;
23
using System.Reflection;
34
using System.Runtime.Loader;
45

@@ -8,9 +9,12 @@ public class ResourceAssemblyLoadContext : AssemblyLoadContext
89
{
910
private readonly AssemblyDependencyResolver resolver;
1011

11-
public ResourceAssemblyLoadContext(string resourcePath)
12+
private readonly string resourceName;
13+
14+
public ResourceAssemblyLoadContext(string resourcePath, string resourceName) : base(resourceName)
1215
{
1316
resolver = new AssemblyDependencyResolver(resourcePath);
17+
this.resourceName = resourceName;
1418
}
1519

1620
protected override Assembly Load(AssemblyName assemblyName)
@@ -21,7 +25,11 @@ protected override Assembly Load(AssemblyName assemblyName)
2125

2226
protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
2327
{
24-
var libraryPath = resolver.ResolveUnmanagedDllToPath(unmanagedDllName);
28+
Console.WriteLine("unmanaged:" + unmanagedDllName);
29+
var libraryPath = resolver.ResolveUnmanagedDllToPath(unmanagedDllName) ??
30+
resolver.ResolveUnmanagedDllToPath(
31+
resourceName + Path.DirectorySeparatorChar + unmanagedDllName);
32+
2533
return libraryPath != null ? LoadUnmanagedDllFromPath(libraryPath) : IntPtr.Zero;
2634
}
2735
}

api/AltV.Net.Mock/MockAltV.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Runtime.Loader;
23
using AltV.Net.Elements.Entities;
34

45
namespace AltV.Net.Mock
@@ -34,7 +35,7 @@ public MockAltV(string entryPoint)
3435
var server = new MockServer(IntPtr.Zero, baseObjectPool, entityPool, playerPool, vehiclePool, blipPool,
3536
checkpointPool, voiceChannelPool);
3637
var cSharpNativeResource = new CSharpNativeResource(IntPtr.Zero);
37-
var module = resource.GetModule(server, cSharpNativeResource, baseObjectPool, entityPool, playerPool,
38+
var module = resource.GetModule(server, AssemblyLoadContext.Default, cSharpNativeResource, baseObjectPool, entityPool, playerPool,
3839
vehiclePool, blipPool, checkpointPool, voiceChannelPool, colShapePool);
3940
resource.OnStart();
4041
}

api/AltV.Net/IResource.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Runtime.Loader;
23
using AltV.Net.Elements.Entities;
34

45
namespace AltV.Net
@@ -36,7 +37,9 @@ IBaseBaseObjectPool GetBaseBaseObjectPool(IEntityPool<IPlayer> playerPool, IEnti
3637
IBaseObjectFactory<IVoiceChannel> GetVoiceChannelFactory();
3738
IBaseObjectFactory<IColShape> GetColShapeFactory();
3839

39-
Module GetModule(IServer server, CSharpNativeResource cSharpNativeResource,
40+
Module GetModule(IServer server,
41+
AssemblyLoadContext assemblyLoadContext,
42+
CSharpNativeResource cSharpNativeResource,
4043
IBaseBaseObjectPool baseBaseObjectPool,
4144
IBaseEntityPool baseEntityPool,
4245
IEntityPool<IPlayer> playerPool,

api/AltV.Net/Module.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using System.Reflection;
55
using System.Runtime.InteropServices;
6+
using System.Runtime.Loader;
67
using AltV.Net.Elements.Args;
78
using AltV.Net.Elements.Entities;
89
using AltV.Net.Events;
@@ -15,6 +16,8 @@ public class Module
1516
{
1617
internal readonly IServer Server;
1718

19+
internal readonly AssemblyLoadContext AssemblyLoadContext;
20+
1821
internal readonly CSharpNativeResource CSharpNativeResource;
1922

2023
internal readonly IBaseBaseObjectPool BaseBaseObjectPool;
@@ -106,7 +109,7 @@ public class Module
106109

107110
internal readonly IDictionary<string, Function> functionExports = new Dictionary<string, Function>();
108111

109-
public Module(IServer server, CSharpNativeResource cSharpNativeResource, IBaseBaseObjectPool baseBaseObjectPool,
112+
public Module(IServer server, AssemblyLoadContext assemblyLoadContext, CSharpNativeResource cSharpNativeResource, IBaseBaseObjectPool baseBaseObjectPool,
110113
IBaseEntityPool baseEntityPool, IEntityPool<IPlayer> playerPool,
111114
IEntityPool<IVehicle> vehiclePool,
112115
IBaseObjectPool<IBlip> blipPool,
@@ -116,6 +119,7 @@ public Module(IServer server, CSharpNativeResource cSharpNativeResource, IBaseBa
116119
{
117120
Alt.Init(this);
118121
Server = server;
122+
AssemblyLoadContext = assemblyLoadContext;
119123
CSharpNativeResource = cSharpNativeResource;
120124
BaseBaseObjectPool = baseBaseObjectPool;
121125
BaseEntityPool = baseEntityPool;

api/AltV.Net/ModuleWrapper.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ public static void Main(IntPtr serverPointer, IntPtr resourcePointer, string res
2323
{
2424
var assemblyLoader = new AssemblyLoader();
2525
MainWithResource(serverPointer, resourcePointer,
26-
new ResourceLoader(serverPointer, assemblyLoader, resourceName, entryPoint).Init());
26+
new ResourceLoader(serverPointer, assemblyLoader, resourceName, entryPoint).Init(),
27+
AssemblyLoadContext.Default);
2728
_scripts = new ScriptLoader(assemblyLoader).GetAllScripts();
2829
_module.OnScriptsLoaded(_scripts);
2930
_resource.OnStart();
@@ -43,14 +44,15 @@ public static void MainWithAssembly(IntPtr serverPointer, IntPtr resourcePointer
4344
return;
4445
}
4546

46-
MainWithResource(serverPointer, resourcePointer, resource);
47+
MainWithResource(serverPointer, resourcePointer, resource, assemblyLoadContext);
4748
//TODO: set delegates here
4849
_scripts = AssemblyLoader.FindAllTypes<IScript>(assemblyLoadContext.Assemblies);
4950
_module.OnScriptsLoaded(_scripts);
5051
ResourceBuilder.SetDelegates(resourcePointer, OnStartResource);
5152
}
5253

53-
public static void MainWithResource(IntPtr serverPointer, IntPtr resourcePointer, IResource resource)
54+
public static void MainWithResource(IntPtr serverPointer, IntPtr resourcePointer, IResource resource,
55+
AssemblyLoadContext assemblyLoadContext)
5456
{
5557
Console.WriteLine("before resource:" + (_resource == null));
5658
_resource = resource;
@@ -78,7 +80,7 @@ public static void MainWithResource(IntPtr serverPointer, IntPtr resourcePointer
7880
var server = new Server(serverPointer, baseObjectPool, entityPool, playerPool, vehiclePool, blipPool,
7981
checkpointPool, voiceChannelPool, colShapePool);
8082
var csharpResource = new CSharpNativeResource(resourcePointer);
81-
_module = _resource.GetModule(server, csharpResource, baseObjectPool, entityPool, playerPool, vehiclePool,
83+
_module = _resource.GetModule(server, assemblyLoadContext, csharpResource, baseObjectPool, entityPool, playerPool, vehiclePool,
8284
blipPool, checkpointPool, voiceChannelPool, colShapePool);
8385
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
8486
}

api/AltV.Net/Resource.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Runtime.Loader;
23
using AltV.Net.Elements.Entities;
34
using AltV.Net.Elements.Factories;
45
using AltV.Net.Elements.Pools;
@@ -96,14 +97,16 @@ public virtual IBaseObjectFactory<IColShape> GetColShapeFactory()
9697
return new ColShapeFactory();
9798
}
9899

99-
public virtual Module GetModule(IServer server, CSharpNativeResource cSharpNativeResource,
100+
public virtual Module GetModule(IServer server,
101+
AssemblyLoadContext assemblyLoadContext,
102+
CSharpNativeResource cSharpNativeResource,
100103
IBaseBaseObjectPool baseBaseObjectPool,
101104
IBaseEntityPool baseEntityPool, IEntityPool<IPlayer> playerPool, IEntityPool<IVehicle> vehiclePool,
102105
IBaseObjectPool<IBlip> blipPool,
103106
IBaseObjectPool<ICheckpoint> checkpointPool, IBaseObjectPool<IVoiceChannel> voiceChannelPool,
104107
IBaseObjectPool<IColShape> colShapePool)
105108
{
106-
return new Module(server, cSharpNativeResource, baseBaseObjectPool, baseEntityPool, playerPool, vehiclePool,
109+
return new Module(server, assemblyLoadContext, cSharpNativeResource, baseBaseObjectPool, baseEntityPool, playerPool, vehiclePool,
107110
blipPool, checkpointPool, voiceChannelPool, colShapePool);
108111
}
109112
}

0 commit comments

Comments
 (0)