【问题标题】:New AppDomain unlock file新的 AppDomain 解锁文件
【发布时间】:2013-08-05 11:01:27
【问题描述】:

我被这个问题困住了第三天,我不知道为什么这不起作用。我只想加载外部 .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)

【问题讨论】:

    标签: c# appdomain unlock


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我刚刚注意到只有接口被锁定。更重要的是,当我加载两个类然后加载两个接口时就可以了。但是当我同时添加接口和实现类时它会锁定

      【讨论】:

        猜你喜欢
        • 2018-08-06
        • 2013-12-09
        • 1970-01-01
        • 2016-12-11
        • 1970-01-01
        • 2021-08-14
        • 1970-01-01
        • 2012-02-27
        • 1970-01-01
        相关资源
        最近更新 更多