.NET可执行文件在从\\localhost\xyz启动时无法加载引用的程序集

6
我的.NET可执行文件abc.exe引用了几个程序集,其中一个叫做xyz.core.exe。当它从通过共享名称指定的网络位置启动时,例如\\localhost\xyz\abc.exe,我遇到了一些问题。如果我将名为Z:的网络驱动器映射到\\localhost\xyz,并启动Z:\abc.exe,则可以正常工作。

.NET似乎在尝试从共享中加载xyz.core.exe程序集时变得混乱。它抛出一个System.IO.FileNotFoundException异常,并提供以下融合日志信息:

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
Running under executable  \\localhost\xyz\abc.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = Workstation\arnaud
LOG: DisplayName = xyz.core, Version=2.5.2.1001, Culture=neutral, PublicKeyToken=...
(Fully-specified)
LOG: Appbase = file://localhost/xyz/
LOG: Initial PrivatePath = NULL
Calling assembly : abc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=...
===
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using machine configuration file from     C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config.
LOG: Post-policy reference: xyz.core, Version=2.5.2.1001, Culture=neutral, PublicKeyToken=...
LOG: Attempting download of new URL file://localhost/xyz/xyz.core.DLL.
LOG: Attempting download of new URL file://localhost/xyz/xyz.core/xyz.core.DLL.
LOG: Attempting download of new URL file://localhost/xyz/xyz.core.EXE.
LOG: Attempting download of new URL file://localhost/xyz/xyz.core/xyz.core.EXE.

通过使用Process Monitor,我从另一个角度观察到了一些尝试访问本地驱动器的路径:

C:\xyz\xyz.core.dll
C:\xyz\xyz.core\xyz.core.dll
C:\xyz\xyz.core.exe
C:\xyz\xyz.core\xyz.core.exe

似乎加载器误解了从网络共享加载的意图,并删除了“\\localhost”以使用“C:”。 问题似乎与安全设置无关(我从未在我的计算机上搞过CASPOL),我正在使用.NET 3.5 SP1,该版本允许从共享启动可执行文件。通过等效映射的网络驱动器字母启动程序的事实应该确认这不是安全问题。问题也与引用到EXE程序集的事实无关,因为对普通DLL程序集的引用会产生相同类型的加载错误。有什么想法可以导致此加载问题?是否有人遇到过这种情况?

你的跟踪显示 \localhost\xyz 共享被映射到 c:\xyz。听起来很合理。它实际上被映射到哪里,装配件在哪里? - Hans Passant
2个回答

2

除了作为一种好奇心,我无法解释“C:\xyz\xyz.core.dll”的含义,但其余部分正是我所期望的。

这似乎与代码访问安全有关。直到最近,你需要使用“caspol”来配置CAS以允许你从任何类型的网络共享中执行exe文件。这在.NET 3.5或.NET 3.5 SP1中发生了改变,使得映射的共享(例如“f:”等)获得了执行权限,但UNC共享没有。

你可以使用“caspol”授予UNC访问权限(像这样),但我认为更好的选择是切换到ClickOnce部署。这仍然可以通过网络共享进行,但包含额外的发布信息,让运行时能够加载它。我相信它也可以用于离线工作(当网络不可用时)并在可能时自动从共享更新(我知道这适用于http部署 - 我相信它适用于网络)。IDE将其呈现为“发布”选项,只需点击几下即可完成。


0

我有点困惑 - 如果你使用 localhost,它应该会指向本地硬盘。

你是在尝试重新映射 localhost 指向其他地方吗?如果是这种情况,这可能会导致问题 - 尝试使用不同的名称。


不,访问 \localhost\share 强制 Windows 经过网络堆栈并直接访问共享,而不是直接映射到本地磁盘。使用我正在使用的计算机的真实名称会产生完全相同的结果。 - Pierre Arnaud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接