应用程序在本地启动或从映射的网络驱动器启动时工作,但不能从 UNC 路径启动



短篇小说

我有一个奇怪的问题,无法在互联网上找到任何解决方案。

这对于一个问题来说可能并不重要,但我更愿意提到我有两个单独的项目,并决定将它们合并为一个解决方案。这两个项目都是简单的通知应用程序。它们在编译后单独工作:在调试期间直接在Visual Studio中工作(无论是在调试模式下还是在发布模式下),在调试器外部本地工作,并将它们复制到本地网络上的某个文件夹中。

但是,在合并它们后,其中一个应用程序在从网络启动时停止工作。

停止工作意味着?

我将调试器附加到已经在运行的进程,发现:

  1. frmMain.Designer.vbinPartial Class frmMaininPrivate Sub InitializeComponent()中的代码工作正常。这是通过在Sub开始时创建一个断点并逐步完成代码直到End Sub来检查的。
  2. 不会触发frmMain.vbinPublic Class frmMaininPrivate Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load中的代码。从InitializeComponent()(点 1)出去后,代码不输入frmMain_Load。主窗体显示在屏幕上,其中包含所有控件,但未初始化/清理,没有图标等。
  3. 单击主窗体上的某些按钮可以打开子窗体,但它们也没有初始化/清理。
  4. 通过单击"X"关闭子窗体不会关闭窗体(通常会关闭)。单击同一子窗体上的cmdClose按钮将关闭该窗体。按钮DialogResult属性设置为Cancel。窗体本身CancelButton属性设置为cmdClose。按ESC也会关闭窗体。

    Private Sub cmdClose_Click(sender As Object, e As EventArgs) Handles cmdClose.Click
    Me.Dispose()
    End Sub
    
  5. 关闭主窗体(无论是通过"X"、cmdClose按钮还是ESC)都会挂起应用程序。

    Private Sub cmdClose_Click(sender As Object, e As EventArgs) Handles cmdClose.Click
    Me.Close()
    End Sub
    
  6. 如果我打开Windows资源管理器并从映射的驱动器Y:folder开始转到共享网络驱动器上应用程序的最终位置,然后从那里启动应用程序 - 它可以工作。

  7. 但是,如果通过\servershare-namefolder选择相同的最终目的地并从那里开始应用程序 - 它不起作用。
  8. 如果应用程序由桌面上的快捷方式启动,则第 6 点和第 7 点的作用相同,并且在此快捷方式中,应用程序的target path是用两种方法之一定义的。

Windows 7,.Net Framework 4.5。

您是否知道如何解决它以及错误在哪里?

错误解释

我决定从应用程序可执行文件中提取图标,而不是像以前那样从资源中提取图标,以避免向可执行文件添加两次相同的图标文件:首先作为添加到项目/属性/应用程序/图标中的应用程序图标,第二次作为添加到项目/属性/资源中的表单图标。

问题是,如果在代码的任何地方(在我的示例中Private Sub form_Load(sender As Object, e As EventArgs) Handles MyBase.Load)添加

Me.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location)

它不适用于返回的 UNC 路径

System.ArgumentException
The filePath does not indicate a valid file or the filePath indicates a Universal Naming Convention (UNC) path.

窗体关闭后运行时发生错误。方法

Assembly.GetExecutingAssembly().Location

返回正确的路径(例如字符串\servershare-namefolder)但方法

Public Shared Function ExtractAssociatedIcon(filePath As String) As Icon

不接受 UNC 路径。

溶液

为了解决这个问题,这里和这里提出了2个笨拙的解决方案。

最新更新