Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 加载表单时将引用的DLL复制到本地目录_.net_Vb.net_Dll - Fatal编程技术网

.net 加载表单时将引用的DLL复制到本地目录

.net 加载表单时将引用的DLL复制到本地目录,.net,vb.net,dll,.net,Vb.net,Dll,我有一个.exe程序,出于多种原因将其转换为DLL。该DLL需要由3个单独的程序引用,这些程序在整个公司的各种机器上使用。将引用此DLL的程序在运行之前会在本地复制 我们有另一个类似设置的程序,尽管只有一个程序使用一个(单独的)DLL。此程序将DLL添加为引用,CopyLocal设置为True。在表单加载中,程序查看DLL的新副本是否在Q:驱动器上,如果在本地,则将其复制。这是它用来复制DLL的代码 Private Sub frmFullCasePicking_Load(ByVal sender

我有一个.exe程序,出于多种原因将其转换为DLL。该DLL需要由3个单独的程序引用,这些程序在整个公司的各种机器上使用。将引用此DLL的程序在运行之前会在本地复制

我们有另一个类似设置的程序,尽管只有一个程序使用一个(单独的)DLL。此程序将DLL添加为引用,CopyLocal设置为True。在表单加载中,程序查看DLL的新副本是否在Q:驱动器上,如果在本地,则将其复制。这是它用来复制DLL的代码

Private Sub frmFullCasePicking_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Try
        Dim LocalInfo As IO.FileInfo = My.Computer.FileSystem.GetFileInfo("C:\tmp\vbPrintLabelDLL.dll")
        Dim RemoteInfo As IO.FileInfo = My.Computer.FileSystem.GetFileInfo("Q:\vbPrintLabelDLL.dll")
        If LocalInfo.LastWriteTime < RemoteInfo.LastWriteTime Then My.Computer.FileSystem.CopyFile("Q:\vbPrintLabelDLL.dll", "C:\tmp\vbPrintLabelDLL.dll", True)
    Catch ex As Exception
        MsgBox(ex.ToString)
        If My.Computer.FileSystem.FileExists("Q:\vbPrintLabelDLL.dll") Then My.Computer.FileSystem.CopyFile("Q:\vbPrintLabelDLL.dll", "C:\tmp\vbPrintLabelDLL.dll")
    End Try
End Sub

我建议您更改
Catch ex As Exception
,以便它捕获特定类型的异常,而不是所有异常


try块中的代码可能会抛出任意数量的异常,这些异常会直接指向问题所在(安全性、连接性等)。

我找到了答案。在我所做的所有研究中,我都没有看到这一点(尽管我不确定我在寻找正确的东西),但我给出了解决方案

他提到DLL在需要时才被引用。我在表单上有一个类级成员,它也包含上面的表单加载函数,由于表单成员是在表单加载函数开始之前处理的,所以DLL会在上面的代码运行之前加载。我临时删除了类级别变量,它完美地复制了DLL


为了解决这个问题,我移动了代码来检查DLL并将其复制到ApplicationEvents下的Startup事件中,因此它会在加载表单之前进行复制,因此我的类级别变量仍然可以以与以前相同的方式使用。

抱歉,我编辑了我的帖子…我正在消息框中显示
ex.ToString
,我已经更新了代码以反映这一点,并添加了确切的错误消息。嗯,这不会是最后一次灾难。其他普通故障模式是用户启动程序两次,反恶意软件给予“这到底是从哪里来的”处理。你必须假设这是行不通的。实际上我已经测试过了,没有遇到任何问题(至少有多个实例同时运行,同时启动)。我想,反恶意软件的测试并不那么容易。我添加了一些代码,这样如果DLL不在它应该在的地方,程序就会抛出一个错误并退出,如果DLL在那里,但是有一个新的版本无法复制。
The process cannot access the file 'C:\Users\rbattle\Desktop\Documents\dotNet Source Code\vbFullCasePicking - Using DLL\vbFullCasePicking\bin\Release\vbPrintLabelDLL.dll' because it is being used by another process.
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)     
    at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite)     
    at Microsoft.VisualBasic.FileIO.FileSystem.CopyOrMoveFile(CopyOrMove operation, String sourceFileName, String destinationFileName, Boolean overwrite, UIOptionInternal showUI, UICancelOption onUserCancel)     
    at Microsoft.VisualBasic.MyServices.FileSystemProxy.CopyFile(String sourceFileName, String destinationFileName, Boolean overwrite)     
    at vbFullCasePicking.frmFullCasePicking.frmFullCasePicking_Load(Object sender, EventArgs e) in C:\Users\rbattle\Desktop\Documents\dotNet Source Code\vbFullCasePicking - Using DLL\vbFullCasePicking\frmFullCasePicking.vb:line 103