.net 如何防止Godot C#加载公共库的其他示例

wfveoks0  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(125)

在Godot中,我试图从dll文件加载C#插件。
但是,当它们与主程序也引用的库共享引用时,被引用的库将第二次加载。
对于同一个库的两个示例,我无法在主程序中使用实现公共类型的类,因为它在技术上来自库的不同示例。
我相信这是因为Godot将它使用的库示例加载到与我在插件中加载的上下文不同的上下文中,这样它就不会看到库已经加载并为当前上下文加载它。
如果这是真的,我需要一些方法来检查godot已经在使用什么上下文,并指定我想加载到该上下文中。但我不知道如何去做,在过去的几天里没有找到任何东西。
我用这个问题做了一个最小的例子
在Library.dll中:

namespace Library
{
    public interface ICommonInterface
    {
    }
}

字符串
在Plugin.dll中(引用Library.dll)

using Library;

namespace PLugin
{
    public class Implimentation : ICommonInterface
    {
    }
}


在Godot脚本中(参考Library.dll)

var commonType = typeof(ICommonInterface);

var dll = Assembly.LoadFrom("Plugin.dll");

foreach (var type in dll.ExportedTypes)
{
  if (type.IsAssignableTo(commonType))
  {
    // This is what should execute, but the commonType here is from a different instance of the library
    // than the plugin is using so it's not the same
  }
  else
  {
    // Proving that the library is being loaded a second time...
    Type otherInterfaceType = type.GetInterfaces()
                                  .Where(interfaceType => interfaceType.Name
                                                                       .Equals(commonType.Name,
                                                                               StringComparison.Ordinal))
                                  .FirstOrDefault();
    if (otherInterfaceType != null
        && otherInterfaceType  != commonType)
    {
        // This is what does execute.
        // This means that there's a different interface with the same name.
        // Checking, the assembly the otherInterfaceType is from has
        // the exact same name, version, and is loaded from the same filepath
        // and it makes me very sad.
    }
  }
}

7cwmlq89

7cwmlq891#

我想出了一个解决办法:
你可以从一个你知道在正确上下文中的类型的程序集(在本例中是IComonInterface)中获取AssemblyLoadContect,并使用它来加载其他程序集。这样,它就在正确的上下文中,并且已经加载的依赖性被看到,而不会再次加载。

var context = AssemblyLoadContext.GetLoadContext(typeof(ICommonInterface).Assembly);
var dll = context.LoadFromAssemblyPath("Plugin.dll");

字符串

相关问题