vb.net如何在代码中动态加载外部dll

时间:2022-01-19 14:01:39
我编写工程A,有个窗体容器a,并有两个按钮b、c。
我想点击按钮b就加载外部B.dll,然后调用里面控件初始化方法进行初始化,添加到a中。
我点击按钮c就加载外部C.dll,同时清除控件B,然后调用里面控件初始化方法进行初始化,添加到a中。
请问如何实现呢?我在网上有找到用LoadLibrary、GetProcAddress、GetDelegateForFunctionPointer,但是实现不了

 Public Function DllRegister(ByVal strFileName As String) As Boolean
        Return (ApiInvoke(strFileName, "InitApplicationStartPath", GetType(DllSelfRegister)) = 0)
    End Function

    Private Function ApiInvoke(ByVal LibFilePath As String, ByVal MethodName As String, ByVal DelegateFunctionType As System.Type) As Object

        Dim MethodPointer As Integer, ModuleHandle As Integer
        Dim ret As Object

        ModuleHandle = LoadLibrary(LibFilePath)//这里可以返回非0
        MethodPointer = GetProcAddress(ModuleHandle, MethodName)//在这里返回的结果为0

        ret = Runtime.InteropServices.Marshal.GetDelegateForFunctionPointer(MethodPointer, DelegateFunctionType).DynamicInvoke()//报错:值不能为空。 参数名: ptr
        FreeLibrary(ModuleHandle)

        Return ret
    End Function

    Private Sub 广电ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 广电ToolStripMenuItem.Click
             DllRegister("Debug_冰箱/MainControl5.12.dll")
    End Sub

    Private Sub 洗衣机ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 洗衣机ToolStripMenuItem.Click
             DllRegister("Debug_空调/MainControl5.12.dll")
    End Sub


20 个解决方案

#1


顶~急求方法!!!

#2


既然是固定的 B.dll 和 C.dll,都直接引用进工程。
设计模式下拖个控件B到a里面,到 .Designer.vb 找对应的代码,复制到 b.click 中,这就是动态添加控件啊。
对C一样处理。

根本不需要“动态加载外部dll”的。

#3


引用 2 楼 Tiger_Zhao 的回复:
既然是固定的 B.dll 和 C.dll,都直接引用进工程。
设计模式下拖个控件B到a里面,到 .Designer.vb 找对应的代码,复制到 b.click 中,这就是动态添加控件啊。
对C一样处理。

根本不需要“动态加载外部dll”的。


抱歉,我没说太清楚。我只是举例B与C,其实还有很多类似的dll。所以点击某个按钮,就加载相应的dll

#4


引用
//在这里返回的结果为0

函数名错误

#5


看什么dll,如果是c++写的,用loadlibrary,c#写的,用assembly.loadfrom

#6


引用 3 楼 beyondsunqixin 的回复:
Quote: 引用 2 楼 Tiger_Zhao 的回复:

既然是固定的 B.dll 和 C.dll,都直接引用进工程。
设计模式下拖个控件B到a里面,到 .Designer.vb 找对应的代码,复制到 b.click 中,这就是动态添加控件啊。
对C一样处理。

根本不需要“动态加载外部dll”的。


抱歉,我没说太清楚。我只是举例B与C,其实还有很多类似的dll。所以点击某个按钮,就加载相应的dll


反射是个很基本的概念、针对底层需求,就好像普通的 c 所编译出的程序、与你基于 .net 框架开发的系统的区别一样。 因此搞懂了基本概念并不能真正“高大上”,还需要解决许多问题。

你可以使用.net 框架中早已成熟的 MEF 框架机制。我在帖子  http://bbs.csdn.net/topics/391970445?page=1 的回复中介绍了 MEF 的应用。

#7


引用 5 楼 caozhy 的回复:
看什么dll,如果是c++写的,用loadlibrary,c#写的,用assembly.loadfrom

谢谢回答!我vb.net用loadform方式去编写如下:
 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("E:/实验室项目/毕业项目/毕业设计_冰冷可靠性测试系统/0.冰冷可靠性测试系统/TestSystem - 全面版本--冰箱/Test/bin/Debug/Debug_冰箱/MainControl5.12.dll")
            Dim classtemp As Type = asm.GetType("MainControl5._12.MainUserControl")//b为nothing
            Dim obj As Object = asm.CreateInstance(classtemp.FullName)
            obj.InitApplicationStartPath(Application.StartupPath + "\Debug_冰箱\")

现在遇到一个问题:我将添加的第三方dll及相关资源放到“Debug_冰箱”文件中,程序运行到 asm.GetType时,classtemp的结果为nothing。
我猜想的原因是:文件“Debug_冰箱”中的MainControl5.12.dll因为需要其他的dll及资源,但是程序默认是从当前工程的debug中去加载而不是“Debug_冰箱”中,但是未找到,所以值为nothing。这个问题怎么解决呢?

#8


引用 4 楼 shingoscar 的回复:
引用
//在这里返回的结果为0

函数名错误

错误?正确的应该是什么

#9


引用 8 楼 beyondsunqixin 的回复:
Quote: 引用 4 楼 shingoscar 的回复:

引用
//在这里返回的结果为0

函数名错误

错误?正确的应该是什么

你当我上帝啊?
问的出这种问题。。。

#10


引用 9 楼 shingoscar 的回复:
Quote: 引用 8 楼 beyondsunqixin 的回复:

Quote: 引用 4 楼 shingoscar 的回复:

引用
//在这里返回的结果为0

函数名错误

错误?正确的应该是什么

你当我上帝啊?
问的出这种问题。。。

你不是说函数名错误了吗?我问下怎么了?

#11


引用 10 楼 beyondsunqixin 的回复:
Quote: 引用 9 楼 shingoscar 的回复:

Quote: 引用 8 楼 beyondsunqixin 的回复:

Quote: 引用 4 楼 shingoscar 的回复:

引用
//在这里返回的结果为0

函数名错误

错误?正确的应该是什么

你当我上帝啊?
问的出这种问题。。。

你不是说函数名错误了吗?我问下怎么了?

谁知道你要用的函数叫什么名字?你让我问谁去?

#12


引用 11 楼 shingoscar 的回复:
Quote: 引用 10 楼 beyondsunqixin 的回复:

Quote: 引用 9 楼 shingoscar 的回复:

Quote: 引用 8 楼 beyondsunqixin 的回复:

Quote: 引用 4 楼 shingoscar 的回复:

引用
//在这里返回的结果为0

函数名错误

错误?正确的应该是什么

你当我上帝啊?
问的出这种问题。。。

你不是说函数名错误了吗?我问下怎么了?

谁知道你要用的函数叫什么名字?你让我问谁去?

vb.net如何在代码中动态加载外部dll
你引用的这里。目前程序里函数LoadLibrary运行正常,GetProcAddress获取不到。
 ModuleHandle = LoadLibrary(LibFilePath)//这里可以返回非0
 MethodPointer = GetProcAddress(ModuleHandle, MethodName)//在这里返回的结果为0

你说函数名错误,哪里错误了?你说我给你要函数名,我又不知道哪个函数错误了,是你说的,你指明呀!

#13


引用 5 楼 caozhy 的回复:
看什么dll,如果是c++写的,用loadlibrary,c#写的,用assembly.loadfrom

谢版主回复,我尝试了assembly.loadfrom,但是它无法卸载已加载的dll文件,这导致我连续加载dll的时候会出现冲突。

#14


1.将DLL读到BYTE数组。
2.
 
Dim ClassName As String = "名称空间.类名"
Dim asm As System.Reflection.Assembly = Assembly.Load(ObjBytes))
Dim obj = asm.CreateInstance(ClassName)  

#15


引用 7 楼 beyondsunqixin 的回复:
Quote: 引用 5 楼 caozhy 的回复:

看什么dll,如果是c++写的,用loadlibrary,c#写的,用assembly.loadfrom

谢谢回答!我vb.net用loadform方式去编写如下:
 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("E:/实验室项目/毕业项目/毕业设计_冰冷可靠性测试系统/0.冰冷可靠性测试系统/TestSystem - 全面版本--冰箱/Test/bin/Debug/Debug_冰箱/MainControl5.12.dll")
            Dim classtemp As Type = asm.GetType("MainControl5._12.MainUserControl")//b为nothing
            Dim obj As Object = asm.CreateInstance(classtemp.FullName)
            obj.InitApplicationStartPath(Application.StartupPath + "\Debug_冰箱\")

现在遇到一个问题:我将添加的第三方dll及相关资源放到“Debug_冰箱”文件中,程序运行到 asm.GetType时,classtemp的结果为nothing。
我猜想的原因是:文件“Debug_冰箱”中的MainControl5.12.dll因为需要其他的dll及资源,但是程序默认是从当前工程的debug中去加载而不是“Debug_冰箱”中,但是未找到,所以值为nothing。这个问题怎么解决呢?

所有动态加载的DLL,默认的工作目录是加载它的主线程的工作目录。所以,要将所有的相关的DLL,资源放到主线程目录下。

#16


引用 15 楼 MSTOP 的回复:
Quote: 引用 7 楼 beyondsunqixin 的回复:

Quote: 引用 5 楼 caozhy 的回复:

看什么dll,如果是c++写的,用loadlibrary,c#写的,用assembly.loadfrom

谢谢回答!我vb.net用loadform方式去编写如下:
 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("E:/实验室项目/毕业项目/毕业设计_冰冷可靠性测试系统/0.冰冷可靠性测试系统/TestSystem - 全面版本--冰箱/Test/bin/Debug/Debug_冰箱/MainControl5.12.dll")
            Dim classtemp As Type = asm.GetType("MainControl5._12.MainUserControl")//b为nothing
            Dim obj As Object = asm.CreateInstance(classtemp.FullName)
            obj.InitApplicationStartPath(Application.StartupPath + "\Debug_冰箱\")

现在遇到一个问题:我将添加的第三方dll及相关资源放到“Debug_冰箱”文件中,程序运行到 asm.GetType时,classtemp的结果为nothing。
我猜想的原因是:文件“Debug_冰箱”中的MainControl5.12.dll因为需要其他的dll及资源,但是程序默认是从当前工程的debug中去加载而不是“Debug_冰箱”中,但是未找到,所以值为nothing。这个问题怎么解决呢?

所有动态加载的DLL,默认的工作目录是加载它的主线程的工作目录。所以,要将所有的相关的DLL,资源放到主线程目录下。

谢谢回复,以上的方法确实可行。我也将LoadFile改为LoadForm,这个就可以设置加载的位置。但是现在有个问题就是,我连续加载相同dll的时候会报错,个人认为是原有的dll加载到内存中后未释放,导致下次加载的时候有冲突。
现在我尝试使用AppDomain的方法去解决,但是现在一直没有走通,不知大神有没有相关的例子。谢谢

#17


贴出我暂时可行的动态加载DLL的代码。

 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("DLL的绝对路径")
            Dim classtemp1 As Type = asm.GetType("MainControl5._12.MainUserControl")//命名空间.类名
            Dim obj1 As Object = asm.CreateInstance(classtemp1.FullName)//创建实例
            obj1.Dock = DockStyle.Fill
            obj1.InitApplicationStartPath(Application.StartupPath)//调用方法


缺点就是不能马上卸载已加载的dll

#18


引用 17 楼 beyondsunqixin 的回复:
贴出我暂时可行的动态加载DLL的代码。

 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("DLL的绝对路径")
            Dim classtemp1 As Type = asm.GetType("MainControl5._12.MainUserControl")//命名空间.类名
            Dim obj1 As Object = asm.CreateInstance(classtemp1.FullName)//创建实例
            obj1.Dock = DockStyle.Fill
            obj1.InitApplicationStartPath(Application.StartupPath)//调用方法


缺点就是不能马上卸载已加载的dll

我以前做ERP时,系统也是动态加载。每个单据有更新时,将原来的FORM/DLL先CLOSE,再设置一次 BILL=NOTHING 。在不关闭系统下再加载新版本没有任何问题。至于你说的连续加载,我有点想不是明白。因为,每反射一次,实际上你得到的是一个实例。本质和 DIM O AS NEW OBJECT 是一样。你可以NEW无数个实例。

#19


引用 17 楼 beyondsunqixin 的回复:
贴出我暂时可行的动态加载DLL的代码。

 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("DLL的绝对路径")
            Dim classtemp1 As Type = asm.GetType("MainControl5._12.MainUserControl")//命名空间.类名
            Dim obj1 As Object = asm.CreateInstance(classtemp1.FullName)//创建实例
            obj1.Dock = DockStyle.Fill
            obj1.InitApplicationStartPath(Application.StartupPath)//调用方法


缺点就是不能马上卸载已加载的dll

你看前面的回复。1.先读到BYTES().为什么要先读到BYTES()呢?那是相当于对DLL解锁。因为用文件反射DLL的话,这个DLL会被系统锁住 。如果读出到BYTES(),然后关闭文件。文件锁就被解除了。

#20


引用 19 楼 MSTOP 的回复:
Quote: 引用 17 楼 beyondsunqixin 的回复:

贴出我暂时可行的动态加载DLL的代码。

 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("DLL的绝对路径")
            Dim classtemp1 As Type = asm.GetType("MainControl5._12.MainUserControl")//命名空间.类名
            Dim obj1 As Object = asm.CreateInstance(classtemp1.FullName)//创建实例
            obj1.Dock = DockStyle.Fill
            obj1.InitApplicationStartPath(Application.StartupPath)//调用方法


缺点就是不能马上卸载已加载的dll

你看前面的回复。1.先读到BYTES().为什么要先读到BYTES()呢?那是相当于对DLL解锁。因为用文件反射DLL的话,这个DLL会被系统锁住 。如果读出到BYTES(),然后关闭文件。文件锁就被解除了。

不好意思好  没走通。
我现在尝试APPDomain方式,网上说那个可以释放内存。不知您是否有相关示例

#1


顶~急求方法!!!

#2


既然是固定的 B.dll 和 C.dll,都直接引用进工程。
设计模式下拖个控件B到a里面,到 .Designer.vb 找对应的代码,复制到 b.click 中,这就是动态添加控件啊。
对C一样处理。

根本不需要“动态加载外部dll”的。

#3


引用 2 楼 Tiger_Zhao 的回复:
既然是固定的 B.dll 和 C.dll,都直接引用进工程。
设计模式下拖个控件B到a里面,到 .Designer.vb 找对应的代码,复制到 b.click 中,这就是动态添加控件啊。
对C一样处理。

根本不需要“动态加载外部dll”的。


抱歉,我没说太清楚。我只是举例B与C,其实还有很多类似的dll。所以点击某个按钮,就加载相应的dll

#4


引用
//在这里返回的结果为0

函数名错误

#5


看什么dll,如果是c++写的,用loadlibrary,c#写的,用assembly.loadfrom

#6


引用 3 楼 beyondsunqixin 的回复:
Quote: 引用 2 楼 Tiger_Zhao 的回复:

既然是固定的 B.dll 和 C.dll,都直接引用进工程。
设计模式下拖个控件B到a里面,到 .Designer.vb 找对应的代码,复制到 b.click 中,这就是动态添加控件啊。
对C一样处理。

根本不需要“动态加载外部dll”的。


抱歉,我没说太清楚。我只是举例B与C,其实还有很多类似的dll。所以点击某个按钮,就加载相应的dll


反射是个很基本的概念、针对底层需求,就好像普通的 c 所编译出的程序、与你基于 .net 框架开发的系统的区别一样。 因此搞懂了基本概念并不能真正“高大上”,还需要解决许多问题。

你可以使用.net 框架中早已成熟的 MEF 框架机制。我在帖子  http://bbs.csdn.net/topics/391970445?page=1 的回复中介绍了 MEF 的应用。

#7


引用 5 楼 caozhy 的回复:
看什么dll,如果是c++写的,用loadlibrary,c#写的,用assembly.loadfrom

谢谢回答!我vb.net用loadform方式去编写如下:
 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("E:/实验室项目/毕业项目/毕业设计_冰冷可靠性测试系统/0.冰冷可靠性测试系统/TestSystem - 全面版本--冰箱/Test/bin/Debug/Debug_冰箱/MainControl5.12.dll")
            Dim classtemp As Type = asm.GetType("MainControl5._12.MainUserControl")//b为nothing
            Dim obj As Object = asm.CreateInstance(classtemp.FullName)
            obj.InitApplicationStartPath(Application.StartupPath + "\Debug_冰箱\")

现在遇到一个问题:我将添加的第三方dll及相关资源放到“Debug_冰箱”文件中,程序运行到 asm.GetType时,classtemp的结果为nothing。
我猜想的原因是:文件“Debug_冰箱”中的MainControl5.12.dll因为需要其他的dll及资源,但是程序默认是从当前工程的debug中去加载而不是“Debug_冰箱”中,但是未找到,所以值为nothing。这个问题怎么解决呢?

#8


引用 4 楼 shingoscar 的回复:
引用
//在这里返回的结果为0

函数名错误

错误?正确的应该是什么

#9


引用 8 楼 beyondsunqixin 的回复:
Quote: 引用 4 楼 shingoscar 的回复:

引用
//在这里返回的结果为0

函数名错误

错误?正确的应该是什么

你当我上帝啊?
问的出这种问题。。。

#10


引用 9 楼 shingoscar 的回复:
Quote: 引用 8 楼 beyondsunqixin 的回复:

Quote: 引用 4 楼 shingoscar 的回复:

引用
//在这里返回的结果为0

函数名错误

错误?正确的应该是什么

你当我上帝啊?
问的出这种问题。。。

你不是说函数名错误了吗?我问下怎么了?

#11


引用 10 楼 beyondsunqixin 的回复:
Quote: 引用 9 楼 shingoscar 的回复:

Quote: 引用 8 楼 beyondsunqixin 的回复:

Quote: 引用 4 楼 shingoscar 的回复:

引用
//在这里返回的结果为0

函数名错误

错误?正确的应该是什么

你当我上帝啊?
问的出这种问题。。。

你不是说函数名错误了吗?我问下怎么了?

谁知道你要用的函数叫什么名字?你让我问谁去?

#12


引用 11 楼 shingoscar 的回复:
Quote: 引用 10 楼 beyondsunqixin 的回复:

Quote: 引用 9 楼 shingoscar 的回复:

Quote: 引用 8 楼 beyondsunqixin 的回复:

Quote: 引用 4 楼 shingoscar 的回复:

引用
//在这里返回的结果为0

函数名错误

错误?正确的应该是什么

你当我上帝啊?
问的出这种问题。。。

你不是说函数名错误了吗?我问下怎么了?

谁知道你要用的函数叫什么名字?你让我问谁去?

vb.net如何在代码中动态加载外部dll
你引用的这里。目前程序里函数LoadLibrary运行正常,GetProcAddress获取不到。
 ModuleHandle = LoadLibrary(LibFilePath)//这里可以返回非0
 MethodPointer = GetProcAddress(ModuleHandle, MethodName)//在这里返回的结果为0

你说函数名错误,哪里错误了?你说我给你要函数名,我又不知道哪个函数错误了,是你说的,你指明呀!

#13


引用 5 楼 caozhy 的回复:
看什么dll,如果是c++写的,用loadlibrary,c#写的,用assembly.loadfrom

谢版主回复,我尝试了assembly.loadfrom,但是它无法卸载已加载的dll文件,这导致我连续加载dll的时候会出现冲突。

#14


1.将DLL读到BYTE数组。
2.
 
Dim ClassName As String = "名称空间.类名"
Dim asm As System.Reflection.Assembly = Assembly.Load(ObjBytes))
Dim obj = asm.CreateInstance(ClassName)  

#15


引用 7 楼 beyondsunqixin 的回复:
Quote: 引用 5 楼 caozhy 的回复:

看什么dll,如果是c++写的,用loadlibrary,c#写的,用assembly.loadfrom

谢谢回答!我vb.net用loadform方式去编写如下:
 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("E:/实验室项目/毕业项目/毕业设计_冰冷可靠性测试系统/0.冰冷可靠性测试系统/TestSystem - 全面版本--冰箱/Test/bin/Debug/Debug_冰箱/MainControl5.12.dll")
            Dim classtemp As Type = asm.GetType("MainControl5._12.MainUserControl")//b为nothing
            Dim obj As Object = asm.CreateInstance(classtemp.FullName)
            obj.InitApplicationStartPath(Application.StartupPath + "\Debug_冰箱\")

现在遇到一个问题:我将添加的第三方dll及相关资源放到“Debug_冰箱”文件中,程序运行到 asm.GetType时,classtemp的结果为nothing。
我猜想的原因是:文件“Debug_冰箱”中的MainControl5.12.dll因为需要其他的dll及资源,但是程序默认是从当前工程的debug中去加载而不是“Debug_冰箱”中,但是未找到,所以值为nothing。这个问题怎么解决呢?

所有动态加载的DLL,默认的工作目录是加载它的主线程的工作目录。所以,要将所有的相关的DLL,资源放到主线程目录下。

#16


引用 15 楼 MSTOP 的回复:
Quote: 引用 7 楼 beyondsunqixin 的回复:

Quote: 引用 5 楼 caozhy 的回复:

看什么dll,如果是c++写的,用loadlibrary,c#写的,用assembly.loadfrom

谢谢回答!我vb.net用loadform方式去编写如下:
 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("E:/实验室项目/毕业项目/毕业设计_冰冷可靠性测试系统/0.冰冷可靠性测试系统/TestSystem - 全面版本--冰箱/Test/bin/Debug/Debug_冰箱/MainControl5.12.dll")
            Dim classtemp As Type = asm.GetType("MainControl5._12.MainUserControl")//b为nothing
            Dim obj As Object = asm.CreateInstance(classtemp.FullName)
            obj.InitApplicationStartPath(Application.StartupPath + "\Debug_冰箱\")

现在遇到一个问题:我将添加的第三方dll及相关资源放到“Debug_冰箱”文件中,程序运行到 asm.GetType时,classtemp的结果为nothing。
我猜想的原因是:文件“Debug_冰箱”中的MainControl5.12.dll因为需要其他的dll及资源,但是程序默认是从当前工程的debug中去加载而不是“Debug_冰箱”中,但是未找到,所以值为nothing。这个问题怎么解决呢?

所有动态加载的DLL,默认的工作目录是加载它的主线程的工作目录。所以,要将所有的相关的DLL,资源放到主线程目录下。

谢谢回复,以上的方法确实可行。我也将LoadFile改为LoadForm,这个就可以设置加载的位置。但是现在有个问题就是,我连续加载相同dll的时候会报错,个人认为是原有的dll加载到内存中后未释放,导致下次加载的时候有冲突。
现在我尝试使用AppDomain的方法去解决,但是现在一直没有走通,不知大神有没有相关的例子。谢谢

#17


贴出我暂时可行的动态加载DLL的代码。

 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("DLL的绝对路径")
            Dim classtemp1 As Type = asm.GetType("MainControl5._12.MainUserControl")//命名空间.类名
            Dim obj1 As Object = asm.CreateInstance(classtemp1.FullName)//创建实例
            obj1.Dock = DockStyle.Fill
            obj1.InitApplicationStartPath(Application.StartupPath)//调用方法


缺点就是不能马上卸载已加载的dll

#18


引用 17 楼 beyondsunqixin 的回复:
贴出我暂时可行的动态加载DLL的代码。

 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("DLL的绝对路径")
            Dim classtemp1 As Type = asm.GetType("MainControl5._12.MainUserControl")//命名空间.类名
            Dim obj1 As Object = asm.CreateInstance(classtemp1.FullName)//创建实例
            obj1.Dock = DockStyle.Fill
            obj1.InitApplicationStartPath(Application.StartupPath)//调用方法


缺点就是不能马上卸载已加载的dll

我以前做ERP时,系统也是动态加载。每个单据有更新时,将原来的FORM/DLL先CLOSE,再设置一次 BILL=NOTHING 。在不关闭系统下再加载新版本没有任何问题。至于你说的连续加载,我有点想不是明白。因为,每反射一次,实际上你得到的是一个实例。本质和 DIM O AS NEW OBJECT 是一样。你可以NEW无数个实例。

#19


引用 17 楼 beyondsunqixin 的回复:
贴出我暂时可行的动态加载DLL的代码。

 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("DLL的绝对路径")
            Dim classtemp1 As Type = asm.GetType("MainControl5._12.MainUserControl")//命名空间.类名
            Dim obj1 As Object = asm.CreateInstance(classtemp1.FullName)//创建实例
            obj1.Dock = DockStyle.Fill
            obj1.InitApplicationStartPath(Application.StartupPath)//调用方法


缺点就是不能马上卸载已加载的dll

你看前面的回复。1.先读到BYTES().为什么要先读到BYTES()呢?那是相当于对DLL解锁。因为用文件反射DLL的话,这个DLL会被系统锁住 。如果读出到BYTES(),然后关闭文件。文件锁就被解除了。

#20


引用 19 楼 MSTOP 的回复:
Quote: 引用 17 楼 beyondsunqixin 的回复:

贴出我暂时可行的动态加载DLL的代码。

 Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.LoadFile("DLL的绝对路径")
            Dim classtemp1 As Type = asm.GetType("MainControl5._12.MainUserControl")//命名空间.类名
            Dim obj1 As Object = asm.CreateInstance(classtemp1.FullName)//创建实例
            obj1.Dock = DockStyle.Fill
            obj1.InitApplicationStartPath(Application.StartupPath)//调用方法


缺点就是不能马上卸载已加载的dll

你看前面的回复。1.先读到BYTES().为什么要先读到BYTES()呢?那是相当于对DLL解锁。因为用文件反射DLL的话,这个DLL会被系统锁住 。如果读出到BYTES(),然后关闭文件。文件锁就被解除了。

不好意思好  没走通。
我现在尝试APPDomain方式,网上说那个可以释放内存。不知您是否有相关示例

#21