为了账号安全,请及时绑定邮箱和手机立即绑定

Assembly卸载DLL有比较完美的解决方案吗

Assembly卸载DLL有比较完美的解决方案吗

红颜莎娜 2018-12-06 11:58:37
最近我使用vs2005做了一个addins在制作的过程中使用Assembly动态加载DLL,其他的地方需要实现删除DLL的操作,因此需要能够实现卸载Assembly动态加载DLL,不知道各位有没有什么好的解决方案。大多数都说用AppDomain来实现,试验过很多,都存在这样或者那样的问题,大家有没有一个比较完美的解决方案啊。 public Assembly LoadAssembly(string filePath) { Assembly asm = null; if (this.copyToMem) { //先将插件拷贝到内存缓冲 byte[] addinStream = null; if (FileHelper.ReadFileToBuff(filePath, out addinStream)) { asm = Assembly.Load(addinStream); //加载内存中的Dll } } else { asm = Assembly.LoadFrom(filePath); } return asm; }   使用过上面的这种方式加载DLL,可是因为需要加载附加的DLL,还是失败。
查看完整描述

1 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

请参考如下代码片段:

 public DynamicAssembly()
        {
            PermissionSet perSet = new System.Security.PermissionSet(System.Security.Permissions.PermissionState.Unrestricted);
            AppDomainSetup objSetup = new AppDomainSetup();
            objSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
            _objAppDomain = AppDomain.CreateDomain("MyAppDomain", null, objSetup, perSet, null);
        }

 

 public void InitCall()
        {
            string strErrorMsg = string.Empty;
            RemoteLoaderFactory factory = (RemoteLoaderFactory)_objAppDomain.CreateInstance("UIT.DynamicExpression.RemoteAccess", "UIT.DynamicExpression.RemoteAccess.RemoteLoaderFactory").Unwrap();

            // with help of factory, create a real 'LiveClass' instance
            _object = factory.Create("UIT.DynamicalExpressionBin.dll", "UIT.DynamicExpression.Eval", null);

            if (_object == null)
            {
                strErrorMsg = "Error: " + "Couldn't load class.";
                Trace.WriteLine(strErrorMsg);
            }
        }

其中RemoteFactory类代码如下:

 public class RemoteLoaderFactory : MarshalByRefObject
    {
        private const BindingFlags bfi = BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance;


        public RemoteLoaderFactory() { }


        public IRemoteInterface Create(string assemblyFile, string typeName, object[] constructArgs)
        {
            return (IRemoteInterface)Activator.CreateInstanceFrom(
                     assemblyFile, typeName, false, bfi, null, constructArgs,
                     null, null, null).Unwrap();
        }
    }

查看完整回答
反对 回复 2019-01-21
  • 1 回答
  • 0 关注
  • 384 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信