提问人:JuanDYB 提问时间:5/20/2023 最后编辑:marc_sJuanDYB 更新时间:5/20/2023 访问量:34
通过反射 c# 加载程序集导致类型比较问题
Assembly loading by reflection c# causes type comparison problem
问:
我有以下情况,其中某些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.Base
Library ProjectA
_basetypes.Contains(t.BaseType)
我认为这是因为从不同的文件夹加载了相同的dll。我一直在寻找,也许我必须有不同的和所有需要单独加载的引用。AppDomains
Library ProjectA
AppDomain
如果我在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);
解决此问题的正确解决方法是否正确?我怎样才能让它工作?如您所见,由于从新加载的装配不起作用,因此无法正常工作。AppDomain
AppDomain
答: 暂无答案
评论