我遇到这个问题已经陷入第3天了,我不知道为什么这不起作用。我只是想加载外部.dll来使用反射读取一些信息并删除文件。问题是读取文件被锁定。最奇怪的是,只有两个文件被锁定,而我成功地读了5个文件。我尝试过没有结果的ShadowCopy。我现在不知道。
这是我的appdomain类:
public class AppDomainExpander
{
private Type[] _types;
public Type[] Types
{
get { return _types; }
set { _types = value; }
}
public void Create(string domainName, string path)
{
AppDomainSetup aps = new AppDomainSetup();
aps.ShadowCopyFiles = "true";
AppDomain dmn = AppDomain.CreateDomain(domainName);
string typename = typeof(DomainCommunicator).FullName;
string assemblyName = typeof(DomainCommunicator).Assembly.FullName;
var inner = (DomainCommunicator)dmn.CreateInstanceAndUnwrap(assemblyName, typename);
inner.Create();
Assembly assembly = Assembly.LoadFrom(path);
Types = assembly.GetTypes();
AppDomain.Unload(dmn); //it's strange that the code even work because i try to unload domain before i get Types[]
}
public class DomainCommunicator : MarshalByRefObject
{
public void Create()
{
AppDomain.CurrentDomain.DomainUnload += new EventHandler(OnDomainUnload);
}
void OnDomainUnload(object sender, EventArgs e)
{
AppDomain.CurrentDomain.DomainUnload -= new EventHandler(OnDomainUnload);
}
}
}
这就是我尝试使用它的方式:
var expander = new AppDomainExpander();
expander.Create("MyDomain", file.Path);
foreach (var type in expander.Types)
答案 0 :(得分:1)
这些类型已加载到未启用AppDomain
功能的主ShadowCopy
。这就是文件被锁定的原因。
您需要使用DomainCommunicator.Create
方法加载程序集。请注意,您无法保留Types属性。这将导致从子AppDomain
泄漏到主要类型的类型以及您当前面临的文件锁定问题。
答案 1 :(得分:0)
我刚注意到只有接口被锁定。更重要的是,当我加载两个类,然后两个接口,它没关系。但是当我同时添加接口和实现类时,它会锁定