vb.net编程,如何使用 appdomain 实现某进程DLL动态加载和卸载?

作者&投稿:苗启 (若有异议请与网页底部的电邮联系)
C#中如何动态加载和卸载DLL~

在C#中我们也能使用Assembly.LoadFile实现动态加载DLL,但是当你试图卸载时,你会很惊讶的发现Assembly没有提供任何卸载的方法。这是由于托管代码的自动垃圾回收机制会做这件事情,所以C#不提供释放资源的函数,一切由垃圾回收来做。powered by 25175.net这引发了一个问题,用Assembly加载的DLL可能只在程序结束的时候才会被释放,这也意味着在程序运行期间无法更新被加载的DLL。而这个功能在某些程序设计时是非常必要的,考虑你正在用反射机制写一个查看DLL中所有函数详细信息的程序,程序提供一个菜单让用户可以选择DLL文件,这时就需要让程序能够卸载DLL,否则一旦用户重新得到新版本DLL时,必须要重新启动程序,重新选择加载DLL文件,这样的设计是用户无法忍受的。C#也提供了实现动态卸载DLL的方法,通过AppDomain来实现。AppDomain是一个独立执行应用程序的环境,当AppDomain被卸载的时候,在该环境中的所有资源也将被回收。关于AppDomain的详细资料参考MSDN。下面是使用AppDomain实现动态卸载DLL的代码,usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Threading;usingSystem.Reflection;namespaceUnloadDll{classProgram{staticvoidMain(string[] args){stringcallingDomainName = AppDomain.CurrentDomain.FriendlyName;//Thread.GetDomain().FriendlyName;Console.WriteLine(callingDomainName);AppDomain ad = AppDomain.CreateDomain("DLL Unload test");ProxyObject obj = (ProxyObject)ad.CreateInstanceFromAndUnwrap(@"UnloadDll.exe","UnloadDll.ProxyObject");obj.LoadAssembly();obj.Invoke("TestDll.Class1","Test","It's a test");AppDomain.Unload(ad);obj =null;Console.ReadLine();}}classProxyObject : MarshalByRefObject{Assembly assembly =null;publicvoidLoadAssembly(){assembly = Assembly.LoadFile(@"TestDLL.dll");}publicboolInvoke(stringfullClassName,stringmethodName,paramsObject[] args){if(assembly ==null)returnfalse;Type tp = assembly.GetType(fullClassName);if(tp ==null)returnfalse;MethodInfo method = tp.GetMethod(methodName);if(method ==null)returnfalse;Object obj = Activator.CreateInstance(tp);method.Invoke(obj, args);returntrue;}}}注意:1. 要想让一个对象能够穿过AppDomain边界,必须要继承MarshalByRefObject类,否则无法被其他AppDomain使用。

引用 里面 把路径再看看清楚

还有 VB装 6.0 SP6 各种补丁要全

还有不知道你用的什么系统 win7 还是XP ?

可能性太多了 就一个截图 很难回答

由于你要求的是能够动态的加载与卸载,所以这里选用了appdomain的load方法来加载一个程序集(同样的,卸载的时候调用appdomain的静态方法Unload即可).
另外由于,在appdomain.load的时候remoting会试图将程序集序列化到defaultdomain中去,这会产生问题,通常以一个"FileNotFoundException"结束,因此采用了一种折中的办法.
思路如下:
1.建立一个新的程序集,里面包含一个轻量的类型,这个类型只包含一个用来加载程序集的公共方法;
2.在你的主程序里面,用appdomain.load来加载上一步的程序集,接着实例化上一步的轻量的类型;
3.而后就可以像操作通常的对象一样,调用它上面的方法来加载你想要的程序集了;

源代码已经打包发给你了, 你看看吧~ 如果有问题,再找我哈


VB6.0与VB.NET有什么区别?
VB.NET和VB6.0有什么区别Visual Basic .NET是Microsoft Visual Studio .NET套件中主要组成部分之一。.NET版本的Visual Basic增加了更多特性,而且演化为完全面向对象(就像C++)的编程语言。本文将介绍VB.NET的新特性,并比较VB6.0\/VB.NET之间的区别,阐述如何利用VB.NET编写简单的应用程序。1.1 什么是 VB.NET? Micr...

如何用matlab的BNT软建立一个贝叶斯网络及条件概率表
bnet=mk_bnet(dag,node_sizes,'names',{'A','S','T','L','B','E','X','D'},'discrete',discrete_nodes);bnet.CPD{A}=tabular_CPD(bnet,A,[0.99,0.01]);bnet.CPD{S}=tabular_CPD(bnet,S,[0.5,0.5]);bnet.CPD{T}=tabular_CPD(bnet,T,[0.99,0.95,0.01,0....

详解.NET编程过程中的线程冲突
原因在于a和b虽然是函数的内部变量没错 但a Number和b Number却不是 它们不存在于堆栈上 而是在托管堆上 可能被其他线程更改 但只使用局部变量的函数在 NET类库中是很少的 但 NET类库中还是有那么多线程安全的函数 是为什么呢?因为 即使一个函数使用了共享资源 如果其所使用的共享资源都是线程安全的 则这个函数...

什么是.NET编程技术
.Net 支持众多的编程语言,所有的编程语言编写的代码都将最终交给 CLR 来执行,因此 .Net 是“语言无关”的。目前微软推出的用于 .Net 开发的语言有:VB.NET J# C# F#,现在的 VC++ 也支持托管 .Net 编程。.Net 编程可应用于很多方面,比如桌面应用程序、WEB应用程序、便携设备应用程序、游戏开发...

如何用VB.net 写注册表
最后要说的是,微软宣言,要将原来的API接口(windows一直使用的标准编程接口)作废,改用.NET接口,故.NET编程方式可能是将来的标准方式。VS.NET系列的软件也集成了通用安装发布软件,只要正确掌握它,就能很好的做出楼主所谓的安装程序。B、第二类软件是大名鼎鼎的Borland公司出品的编程软件,它也包括两大系列。即API系列和...

VB.net开发C\/S产品功能如何
VB.NET的支持者们认为新语言在很多方面比旧版本更为强大,比如它以相比早期版本更为自然、紧密和完全的方式地加入了现代面向对象的编程范式。反对者们有不同意见,虽然VB6对对象模型支持有缺点,但是二次开发升级到VB.NET 的成本比升级后的收益要高得多。而开发软件发布因特网版本的独立程序员也对VB.NET的RunTime尺...

VB\/vb.net编程 扑克牌
picDraw.Line (i * 80 + 8, 40)-(i * 80 + 79, 136), , BNextpicDraw.CurrentX = 24picDraw.CurrentY = 78picDraw.Print "扑克牌 扑克牌 扑克牌 扑克牌 发牌"picDraw.Line (20, 150)-(212, 166), vbWhite, BFpicDraw.CurrentX = 24picDraw.CurrentY = 153picDraw.Print "编辑算式或分步...

哪种编程语言最好学?
C是学习高级语言的基础;C++主要用于编写大型软件核心代码和汇编一样,比较难学,不过学好了后,很有前途;C#主要用于编写一些系统软件,比如游戏引擎核心代码,编写比较简单,界面比较友好;ASP.NET主要是用C#语言编写开发网站(B\/S架构)。 J2EE是用很广泛,主要偏向于企业应用软件和一些桌面系统(C\/S架构),计算机平台;第二...

有关编程NET方面的知识
归纳起来,.NET的主要组成部分如下。.NET Framework(.NET框架):.NET应用系统运行支撑平台。Visual Studio 2005:集成的应用系统开发平台。XML Web Service:基于Web、面向服务的软件系统开发技术。Smart Client:智能客户机技术,融合了C\/S模式和B\/S模式的优点的应用系统开发技术。.NET企业服务器产品:...

VB.net语言当中,And和AndAlso有什么区别?
AndAlso相比And的区别,除了性能优势外,更重要的是,从语义上来说 If a Then If b Then End If End If 等价于If a AndAlso b Then而不等价于If a And b Then 考虑这种情况:Dim m As ClassM= Dim c=m IsNot Nothing AndAlso m.Succeeded 这种实际编程中经常遇到的判断,如果把AndAlso...

济宁市19319245424: 怎样把用vb编的程序安装到手机上? -
由垄樟脑: 要看是什么手机,如果是Windows Mobile 6.5及其一下的,VB.net编写的智能手机类型软件可以运行在这手机上 如果手机系统是Windows Phone 7及其以上的,VB.net编写的也能运行,但是和上面提到的是两种不同的.net程序 如果手机是功能机,或者安卓,或者苹果黑莓这样的,就不用想了.

济宁市19319245424: vb.net 怎样控制其它应用程序 -
由垄樟脑: 很简单,取到程序句柄,之后找到想控制的控件,通过程序给他改值或控制就可以了

济宁市19319245424: vb.net怎么用app.config的ConnectionString来连接数据库? -
由垄樟脑: 直接代码的话像sql 如果如果去别的机器的话 还要改连接字符串的话 还要把整个项目代码拿过去而 写在 app.config配置文件中的话 别人可以去改 无需整个拿过去的直接写在代码中 效率肯定是高的但是 要看远的方面 别人使用呢?所以就出现了 app.config 配置文件了这种想法的覆盖很多地方的

济宁市19319245424: vb.net怎么用app.config的ConnectionString来连接数据库?
由垄樟脑: cnn.ConnectionString ="server=.;uid=sa;pwd=;database=库名"; cnn.open(); cmd.connection=cnn; cmd.commandText=sql; cmd.commandType=commandType.text; dataR.selectcommand=cmd;

济宁市19319245424: vb.net如何发布应用程序 -
由垄樟脑: 其实不用发布 只要按菜单栏的生成 然后到项目的目录里obj\Release\**.exe 或者bin\Release\**.exe 只要没有运用别的控件,这是最快的办法 如果有的话,就要打包到一个目录下

济宁市19319245424: VB.NET想要调用兼容的软件如何调用 -
由垄樟脑: 程序的兼容模式设置保存在注册表下.在 HKEY_CURRENT_USER/Software/Microsoft/Windows NT/CurrentVersion/AppCompatFlags/Layers/ 下新建一个键值,键值名称是可执行程序文件的完全路径,数据类型为reg_sz,数据数值为兼容的操...

济宁市19319245424: VB中的App函数怎么用?
由垄樟脑: APP 就相当于ME的意思 这里就是指的程序本身 Apath=App.Path 这句是说该程序的盘符地址 赋值给Apath FilePath=Apath+"\HAN.BMP" 着句是说FilePath的盘符地址就是Apath对应的的盘符地址后面加"\HAN.BMP" Picture1.Picture=LoadPicture(FilePath) 然后再将FilePath的盘符地址对应的图片也就是HAN.BMP 载入Picture1 这么解释不晓得你看看得懂

济宁市19319245424: 在VB.NET中创建应用程序的步骤有哪些? -
由垄樟脑: 主要有以下几步骤: 创建工程 界面设计 代码编写 功能调试 编译打包 发布

济宁市19319245424: VB可以做什么?编的程序可以做哪方面使用?有哪些常用软件是用VB写的?那些游戏是用什么做的? -
由垄樟脑: VB可以编可视化界面的程序,什么管理系统、信息系统都可以做,界面直观操作和编写都很简单. 巴特,VB已经慢慢退出历史舞台了,因为VB需要外部控件、没有类概念,很多地方不如C++也有很多地方不如抓哇,也不好移植底层也做的不好,so 它一般只用于计算机语言学习的入门,很少商用了.游戏大部分是用C++写滴,C++还是很强大滴

济宁市19319245424: 怎样用vb.net编制手机播放?怎样用vb.net编制手机播放器
由垄樟脑: VB是微软发布的一个编程工具,想学习编程就要1.首先能看懂代码2.会编写代码.建议你找一些书看看

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网