【问题标题】:Application works when started locally or from mapped network drive but not from UNC path应用程序在本地启动或从映射的网络驱动器但不是从 UNC 路径启动时工作
【发布时间】:2017-03-30 17:41:24
【问题描述】:

短篇小说

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

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

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

停止工作意味着什么?

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

  1. frmMain.Designer.vbPartial Class frmMainPrivate Sub InitializeComponent() 中的代码可以正常工作。这可以通过在Sub 开头设置断点并逐步执行代码直到End Sub 进行检查。
  2. frmMain.vbPublic Class frmMainPrivate 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. 但是,如果通过 \\server\share-name\folder 选择相同的最终目的地并从那里启动应用程序 - 它不起作用。
  8. 如果应用程序通过桌面上的快捷方式启动,并且在此应用程序的快捷方式target path 中以两种方法之一定义,则第 6 点和第 7 点的作用相同。

Windows 7、.Net Framework 4.5。

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

【问题讨论】:

  • 你是在派生你的课程还是类似的东西?看起来您几乎合并了项目,但代码仍在使用对 DLL 的引用。
  • 有两个不同的权限集可能是原因。 “NTFS”权限将使您可以像在计算机上一样访问目录,但共享文件夹权限不同。问题可能是用户无法通过共享访问应用程序所需的所有文件夹/文件,但他们可以通过 NTFS 访问。第二个潜在问题可能是您构建文件路径的方式,但如果没有任何代码,就很难说出任何事情。
  • 我相信 .NET 程序在不同的 CAS 策略下运行,具体取决于它们的启动位置。您可以尝试here 中提到的配置设置,看看它是否对您有帮助。
  • @Juan @ps2goat 不,我没有得到任何东西。这些应用程序在他们独自一人时可以工作,无论它们是如何启动的以及由谁启动的。我自己从资源管理器启动应用程序时遇到问题,该应用程序通常使用服务器路径而不是映射路径打开。这些以前可以工作,因为它们不是 1.0.0.0 版...我现在通过修改所有用户的快捷方式来修复这种情况,方法是通过 Y:` not \\sever` 修改目标路径。我不知道为什么代码不会从 InitializeComponent 切换到 MyBase.Load
  • @Bradley Uffner 明天上班我会检查它,因为在花了几个小时试图找到根本原因后我一无所知。谢谢。我会通知你的。

标签: c# vb.net forms winforms unc


【解决方案1】:

错误说明

我决定从应用程序可执行文件中提取图标,而不是像以前那样从资源中提取图标,以避免向可执行文件添加两次相同的图标文件:首先作为应用程序图标添加到 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

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

Public Shared Function ExtractAssociatedIcon(filePath As String) As Icon

不接受 UNC 路径。

解决方案

为了解决这个问题,提出了两个笨拙的解决方案herehere

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多