我有以下场景,其中一些 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 as normal reference
Also load by reflection Library 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
whitch 加载时,使用反射(相同版本)会发生一些事情,使 _basetypes.Contains(t.BaseType)
不工作。
我认为这是因为从不同的文件夹加载了相同的 dll。我一直在搜索,也许我必须有不同的
AppDomains
和所有Library ProjectA
需要单独加载的参考文献AppDomain
.
如果我在 bin 文件夹中拥有所有 dll,则没有问题,一切正常。
我尝试使用新的 AppDomain 加载 Library ProjectA 但出现异常
Library ProjectA and any of it's dependencies could not be loaded. The system coudl not locate the specified file
.
这个很好用
var assembly = Assembly.LoadFrom(LibraryProjectAPath);
var someType = assembly.GetType("Comms.ClientWrapper");
Activator.CreateInstance(someType);
Thorrows 提到的异常。
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
加载的程序集无法正常工作。