修改加载项的加载方式,以解决循环依赖问题

This commit is contained in:
milimoe 2025-01-19 01:33:35 +08:00
parent 7d6ad5bc84
commit 05d1c7204a
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
2 changed files with 98 additions and 8 deletions

View File

@ -58,8 +58,8 @@ namespace Milimoe.FunGame.Core.Api.Utility
GameModuleLoader loader = new(); GameModuleLoader loader = new();
if (runtime == FunGameInfo.FunGame.FunGame_Desktop) if (runtime == FunGameInfo.FunGame.FunGame_Desktop)
{ {
AddonManager.LoadGameModules(loader.Modules, loader.Characters, loader.Skills, loader.Items, delegates, otherobjs);
AddonManager.LoadGameMaps(loader.Maps, otherobjs); AddonManager.LoadGameMaps(loader.Maps, otherobjs);
AddonManager.LoadGameModules(loader.Modules, loader.Characters, loader.Skills, loader.Items, delegates, otherobjs);
foreach (GameModule module in loader.Modules.Values.ToList()) foreach (GameModule module in loader.Modules.Values.ToList())
{ {
// 读取模组的依赖集合 // 读取模组的依赖集合
@ -70,8 +70,8 @@ namespace Milimoe.FunGame.Core.Api.Utility
} }
else if (runtime == FunGameInfo.FunGame.FunGame_Server) else if (runtime == FunGameInfo.FunGame.FunGame_Server)
{ {
AddonManager.LoadGameModulesForServer(loader.ModuleServers, loader.Characters, loader.Skills, loader.Items, delegates, otherobjs);
AddonManager.LoadGameMaps(loader.Maps, otherobjs); AddonManager.LoadGameMaps(loader.Maps, otherobjs);
AddonManager.LoadGameModulesForServer(loader.ModuleServers, loader.Characters, loader.Skills, loader.Items, delegates, otherobjs);
foreach (GameModuleServer server in loader.ModuleServers.Values.ToList()) foreach (GameModuleServer server in loader.ModuleServers.Values.ToList())
{ {
server.GameModuleDepend.GetDependencies(loader); server.GameModuleDepend.GetDependencies(loader);

View File

@ -33,7 +33,22 @@ namespace Milimoe.FunGame.Core.Service
foreach (string dll in dlls) foreach (string dll in dlls)
{ {
// 加载目录下所有的DLL // 加载目录下所有的DLL
Assembly assembly = Assembly.LoadFrom(dll); Assembly? assembly = null;
try
{
assembly = Assembly.LoadFrom(dll);
}
catch
{
try
{
assembly = Assembly.Load(Path.GetFileName(dll));
}
catch
{
continue;
}
}
foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Plugin)))) foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Plugin))))
{ {
@ -71,7 +86,22 @@ namespace Milimoe.FunGame.Core.Service
foreach (string dll in dlls) foreach (string dll in dlls)
{ {
// 加载目录下所有的DLL // 加载目录下所有的DLL
Assembly assembly = Assembly.LoadFrom(dll); Assembly? assembly = null;
try
{
assembly = Assembly.LoadFrom(dll);
}
catch
{
try
{
assembly = Assembly.Load(Path.GetFileName(dll));
}
catch
{
continue;
}
}
foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(ServerPlugin)))) foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(ServerPlugin))))
{ {
@ -109,7 +139,22 @@ namespace Milimoe.FunGame.Core.Service
foreach (string dll in dlls) foreach (string dll in dlls)
{ {
// 加载目录下所有的DLL // 加载目录下所有的DLL
Assembly assembly = Assembly.LoadFrom(dll); Assembly? assembly = null;
try
{
assembly = Assembly.LoadFrom(dll);
}
catch
{
try
{
assembly = Assembly.Load(Path.GetFileName(dll));
}
catch
{
continue;
}
}
foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(WebAPIPlugin)))) foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(WebAPIPlugin))))
{ {
@ -149,7 +194,22 @@ namespace Milimoe.FunGame.Core.Service
foreach (string dll in dlls) foreach (string dll in dlls)
{ {
Assembly assembly = Assembly.LoadFrom(dll); Assembly? assembly = null;
try
{
assembly = Assembly.LoadFrom(dll);
}
catch
{
try
{
assembly = Assembly.Load(Path.GetFileName(dll));
}
catch
{
continue;
}
}
foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => typeof(IAddon).IsAssignableFrom(type))) foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => typeof(IAddon).IsAssignableFrom(type)))
{ {
@ -208,7 +268,22 @@ namespace Milimoe.FunGame.Core.Service
foreach (string dll in dlls) foreach (string dll in dlls)
{ {
Assembly assembly = Assembly.LoadFrom(dll); Assembly? assembly = null;
try
{
assembly = Assembly.LoadFrom(dll);
}
catch
{
try
{
assembly = Assembly.Load(Path.GetFileName(dll));
}
catch
{
continue;
}
}
foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => typeof(IAddon).IsAssignableFrom(type))) foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => typeof(IAddon).IsAssignableFrom(type)))
{ {
@ -263,7 +338,22 @@ namespace Milimoe.FunGame.Core.Service
foreach (string dll in dlls) foreach (string dll in dlls)
{ {
Assembly assembly = Assembly.LoadFrom(dll); Assembly? assembly = null;
try
{
assembly = Assembly.LoadFrom(dll);
}
catch
{
try
{
assembly = Assembly.Load(Path.GetFileName(dll));
}
catch
{
continue;
}
}
foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(GameMap)))) foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(GameMap))))
{ {