Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 新的AppDomain解锁文件_C#_Appdomain_Unlock - Fatal编程技术网

C# 新的AppDomain解锁文件

C# 新的AppDomain解锁文件,c#,appdomain,unlock,C#,Appdomain,Unlock,我被这个问题困住了第三天,我不知道为什么这不起作用。我只想加载external.dll,使用反射读取一些信息,然后删除文件。问题是读取的文件被锁定。最奇怪的是,当我成功读取其中5个文件时,只有两个文件被锁定。我试过影印,但没有结果。我现在不知道 这是我的appdomain类: public class AppDomainExpander { private Type[] _types; public Type[] Types {

我被这个问题困住了第三天,我不知道为什么这不起作用。我只想加载external.dll,使用反射读取一些信息,然后删除文件。问题是读取的文件被锁定。最奇怪的是,当我成功读取其中5个文件时,只有两个文件被锁定。我试过影印,但没有结果。我现在不知道

这是我的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)

我只是注意到只有接口被锁定。更重要的是,当我加载两个类和两个接口时,一切正常。但是,当我同时添加接口和实现类时,它会锁定

类型将加载到主
AppDomain
,而主
AppDomain
没有启用
ShadowCopy
功能。这就是文件被锁定的原因

您需要在
DomainCommunicator.Create
方法中加载程序集。但请注意,不能保留Types属性。这将导致类型从子
AppDomain
泄漏到主类型,以及当前面临的文件锁定问题