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

Application works when started locally or from mapped network drive but not from UNC path

短篇小说

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

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

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

停止工作意味着什么?

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

  1. frmMain.Designer.vb Partial Class frmMain Private Sub InitializeComponent() 中的代码可以正常工作。这是通过在 Sub 的开头创建断点并逐步执行代码直到 End Sub.
  2. 来检查的
  3. frmMain.vb Public Class frmMain Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load 中的代码未被触发。从InitializeComponent()出去后(第1点)代码没有进入frmMain_Load。主窗体显示在屏幕上,包含所有控件但不包含 initialized/cleaned,没有图标等
  4. 单击主窗体上的一些按钮允许我打开子窗体,但它们也不是 initialized/cleaned。
  5. 通过单击 "X" 关闭子窗体不会关闭窗体(通常会关闭)。单击同一子窗体上的 cmdClose 按钮可关闭窗体。按钮已将 DialogResult 属性 设置为 Cancel。表单本身已将 CancelButton 属性 设置为 cmdClose。按 ESC 也会关闭表单。

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

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

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

Windows7、.Net Framework 4.5.

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

错误说明

我决定从应用程序可执行文件中提取图标,而不是像以前那样从资源中提取图标,以避免向可执行文件添加两次相同的图标文件:第一次作为应用程序图标添加到 Project/Properties/Application/Icon 中,第二次作为添加到 Project/Properties/Resources.

中的表单图标

问题是如果在代码的任何地方(在我 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

returns 正确路径(例如字符串 \server\share-name\folder)但方法

Public Shared Function ExtractAssociatedIcon(filePath As String) As Icon

不接受 UNC 路径。

解决方案

为了解决这个问题,提出了 2 个笨拙的解决方案 here and here