通过反射 c# 加载程序集导致类型比较问题

Assembly loading by reflection c# causes type comparison problem

提问人:JuanDYB 提问时间:5/20/2023 最后编辑:marc_sJuanDYB 更新时间:5/20/2023 访问量:34

问:

我有以下情况,其中某些dll可以作为普通引用引用,也可以通过反射加载。

我有一个带有 xml 配置文件的库,它指定必须加载哪些库(因为并非在所有情况下都需要相同的库)。

dll 按如下方式加载。当 exe 程序没有任何加载的程序集作为引用时,这工作得很好,但在某些情况下,这些 dll 可以在 exe 项目中用作引用,以使用库中的某些消息类。

public class MessageTranslator {
    private readonly Type[] _baseTypes = new Type[] {
        typeof(MessageBase),
        typeof(MessageEventBase),
        typeof(MessageGetBase)
    };

    public void LoadAssembly(string asseblyPath) {
        var assembly = Assembly.LoadFrom(asseblyPath);
        var types = assembly.GetTypes().Where(t => t.IsClass && t.IsAbstract && _basetypes.Contains(t.BaseType));
    }
}

exe程序,具有:

  • Lib.Messages.Battery 作为正常引用
  • 也通过反射库项目加载

库项目 A 通过反射加载组件

Lib.Messages.Base
Lib.Messages.Network
Lib.Messages.Battery

问题是两个dll都被复制到Exe文件的bin文件夹中。然后,当该dll也从另一个文件夹中加载时,使用反射(相同版本)会发生一些使无法正常工作的事情。Lib.Messages.Battery extends from Lib.Messages.BaseLibrary ProjectA_basetypes.Contains(t.BaseType)

我认为这是因为从不同的文件夹加载了相同的dll。我一直在寻找,也许我必须有不同的和所有需要单独加载的引用。AppDomainsLibrary ProjectAAppDomain

如果我在bin文件夹中有所有的dll,那就没有问题,一切正常。

我尝试使用新的 AppDomain 加载库 ProjectA,但出现异常

无法加载库 ProjectA 及其任何依赖项。系统找不到指定的文件

这很有效

var assembly = Assembly.LoadFrom(LibraryProjectAPath);
var someType = assembly.GetType("Comms.ClientWrapper");
Activator.CreateInstance(someType);

这会引发提到的异常。

var setup = AppDomain.CurrentDomain.SetupInformation;
setup.ApplicationBase = Path.GetDirectoryName(LibraryProjectAPath);
var newDomain = AppDomain.CreateDomain("newDomain", null, setup);
var assemblyName = AssemblyName.GetAssemblyName(LibraryProjectAPath);
newDomain.Load(assemblyName);

解决此问题的正确解决方法是否正确?我怎样才能让它工作?如您所见,由于从新加载的装配不起作用,因此无法正常工作。AppDomainAppDomain

C# AppDomain System.Reflection 程序集加载

评论


答: 暂无答案