在用Assembly.Load 或者Assembly.Loadfrom读取dll时,dll将被锁定,也就是该程序集无法被更新,修改或删除,下面介绍一下如何获取该程序集并使其不被锁定。
(方法一)
首先会创建出两个类,一个Loader一个是RemoteLoader
说明:1、Loader类提供创建子程序域和卸载程序域的方法;2、RemoteLoader类提供装载程序集方法;3、Loader类获得RemoteLoader类的代理对象,并调用RemoteLoader类的方法;4、RemoteLoader类的方法在子程序域中完成;5、Loader类和RemoteLoader类均放在AssemblyLoader.dll程序集文件中;
我们再来看代码:Loader类:SetRemoteLoaderObject()方法:
代码中的变量rl为RemoteLoader类对象,在Loader类中是其私有成员。SetRemoteLoaderObject()方法实际上提供了两个功能,一是创建了子程序域,第二则是获得了RemoteLoader类对象。
请大家一定要注意语句:rl = (AssemblyLoader.RemoteLoader)domain.CreateInstanceFromAndUnwrap("AssemblyLoader.dll","AssemblyLoader.RemoteLoader");这条语句就是实现两个程序域之间通讯的关键。因为Loader类是在主程序域中,RemoteLoader类则是在子程序域中。如果我们在Loader类即主程序域中显示实例化RemoteLoader类对象rl,此时调用rl的方法,实际上是在主程序域中调用的。因此,我们必须使用代理的方式,来获得rl对象,这就是CreateInstanceFromAndUnwrap方法的目的。其中参数一为要创建类对象的程序集文件名,参数二则是该类的类型名。
CreateCreateInstanceFromAndUnwrap方法有多个重载。代码中的调用方式是当RemoteLoader类为默认构造函数时的其中一种重载。如果RemoteLoader类的构造函数有参数,则方法应改为:
详细的调用方式可以参考MSDN。
以下Loader类的Unload方法和LoadAssembly方法():
当我们调用Unload方法时,则程序域domain加载的程序集也将随着而被卸载。LoadAssembly方法中的异常AssemblyLoadFailureException为自定义异常:
既然在Loader类获得的RemoteLoader类实例必须通过代理的方式,因此该类对象必须支持被序列化。所以我们可以令该类派生MarshalByRefObject。RemoteLoader类的代码:
通过上述的两个类,我们就可以实现程序集的加载和卸载。另外,为了保证应用程序域的对象在内存中被清除,应该令这两个类都实现IDisposable接口,和实现Dispose()方法。
在应用时,只需要调用Loader的LoadAssembly方法。
(方法二)
只需将该dll 读取到一个字节数组,然后再调用Assembly. Load(),相当于给该dll创建了一个副本。
Bye[] content=File.ReadAllBytes(assemblyPath); Assembly assembly=Assembly.Load(content);
您还没有登录,请您登录后再发表评论
Unity读取Excel时打包成exe会报错,将这些文件放到项目Assets中的Plugins目录下即可解决。文件列表: Excel.dll ICSharpCode.SharpZipLib.dll I18N.CJK.dll I18N.dll I18N.MidEast.dll I18N.Other.dll I18N.Rare.dll...
可以借助这个类库文件轻松读取Word资料
读取系统版本信息 读取DLL或EXE版本信息 适用于PowerBuilder11以上
unity读取excel文件所需要的dll文件。unity读取excel文件所需要的dll文件。unity读取excel文件所需要的dll文件。
C#动态读取DLL,文件
三个Excel读取必备Dll文件:Excel.dll 和ICSharpCode.SharpZipLib库文件,导入Unity工程中后,可使用using Excel命名空间使用相关的方法
身份证读卡器 通用读取信息DLL
Aspose.Pdf.dll 新手勿下载
读取 CAD dwg 文件的dll 库文件,,The DLL library file that reads the CAD file can be called by c++ and so on.
包涵Apose.dll,此dll用于.net 读取Word,excel,ppt等文本内容。资源中包含读取方法
Unity 读取Excel文件 包含 Excel.dll ICSharpCode.SharpZipLib System.Data
国外比较著名的c#语言开发的csv文档读取类,能够快速的读取csv文档,可以把csv当成内存表进行操作
Unity 读取Excel用的dll文件,详情请看博文: https://editor.csdn.net/md/?articleId=119449823
C#读取hdf5的相关代码和所需要用到的DLL
直接在内存中加载dll , 自己用PE实现 LoadLibrary
读取写入INI把代码打包成DLL方便调用,有实用的
做项目突然想优化一下数据的输入方式,并不想用代码一行一行的插入,感觉很low...首先你得去Excel的官网下载他的动态链接库:一个Excel.dll,一个ICSharpCode.SharpZipLib.dll,然后放在项目目录下,最好是在plugins下。
Java读取注册表所需的jar包和dll文件(32位和64位)
本DLL是我用一个晚上的时间写的,大家可以用来写自己的注册软件。...本DLL可以读取硬盘物理序列号、CPU序列号、支持MD5、DES,还有一个通过硬盘与CPU的序列号产生的序列号。用这个序列号大家可以做自己的共享软件!
功能:让jacob可在当前路径下的dll文件夹内读取相关依赖的dll文件,免去复制到系统文件夹的麻烦。 详情:http://4462080.blog.51cto.com/4452080/1271614
相关推荐
Unity读取Excel时打包成exe会报错,将这些文件放到项目Assets中的Plugins目录下即可解决。文件列表: Excel.dll ICSharpCode.SharpZipLib.dll I18N.CJK.dll I18N.dll I18N.MidEast.dll I18N.Other.dll I18N.Rare.dll...
可以借助这个类库文件轻松读取Word资料
读取系统版本信息 读取DLL或EXE版本信息 适用于PowerBuilder11以上
unity读取excel文件所需要的dll文件。unity读取excel文件所需要的dll文件。unity读取excel文件所需要的dll文件。
C#动态读取DLL,文件
三个Excel读取必备Dll文件:Excel.dll 和ICSharpCode.SharpZipLib库文件,导入Unity工程中后,可使用using Excel命名空间使用相关的方法
身份证读卡器 通用读取信息DLL
Aspose.Pdf.dll 新手勿下载
读取 CAD dwg 文件的dll 库文件,,The DLL library file that reads the CAD file can be called by c++ and so on.
包涵Apose.dll,此dll用于.net 读取Word,excel,ppt等文本内容。资源中包含读取方法
Unity 读取Excel文件 包含 Excel.dll ICSharpCode.SharpZipLib System.Data
国外比较著名的c#语言开发的csv文档读取类,能够快速的读取csv文档,可以把csv当成内存表进行操作
Unity 读取Excel用的dll文件,详情请看博文: https://editor.csdn.net/md/?articleId=119449823
C#读取hdf5的相关代码和所需要用到的DLL
直接在内存中加载dll , 自己用PE实现 LoadLibrary
读取写入INI把代码打包成DLL方便调用,有实用的
做项目突然想优化一下数据的输入方式,并不想用代码一行一行的插入,感觉很low...首先你得去Excel的官网下载他的动态链接库:一个Excel.dll,一个ICSharpCode.SharpZipLib.dll,然后放在项目目录下,最好是在plugins下。
Java读取注册表所需的jar包和dll文件(32位和64位)
本DLL是我用一个晚上的时间写的,大家可以用来写自己的注册软件。...本DLL可以读取硬盘物理序列号、CPU序列号、支持MD5、DES,还有一个通过硬盘与CPU的序列号产生的序列号。用这个序列号大家可以做自己的共享软件!
功能:让jacob可在当前路径下的dll文件夹内读取相关依赖的dll文件,免去复制到系统文件夹的麻烦。 详情:http://4462080.blog.51cto.com/4452080/1271614