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

问题描述 投票:0回答:0

我有以下场景,其中一些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 作为正常参考
  • 同样通过反射库ProjectA加载

Library ProjectA 通过反射加载程序集

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

问题是

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

我认为这是因为从不同的文件夹加载了相同的 dll。我一直在搜索,也许我必须有不同的

AppDomains
和所有
Library ProjectA
需要单独加载的参考文献
AppDomain
.

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

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

Library 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);

AppDomain
是解决此问题的正确解决方法吗?我怎样才能让它发挥作用?如您所见,无法正常工作,因为从新
AppDomain
加载的程序集无法正常工作。

c# appdomain system.reflection assembly-loading
© www.soinside.com 2019 - 2024. All rights reserved.