从\\ localhost\xyz启动时,.NET可执行文件不会加载引用的程序集

Pie*_*aud 6 c# networking load fusion assembly-resolution

我的.NET可执行文件abc.exe引用了几个程 其中一个被称为xyz.core.exe.当从通过共享名称指定的网络位置启动它时,我无法使其工作\\localhost\xyz\abc.exe.如果我挂载名为Z:on 的网络驱动器号\\localhost\xyz并且如果我启动,这可以正常工作Z:\abc.exe.

尝试xyz.core.exe从共享加载程序集时,.NET似乎变得混乱.它会引发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.
Run Code Online (Sandbox Code Playgroud)

通过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
Run Code Online (Sandbox Code Playgroud)

就好像加载器误解了从网络共享加载的意图并放弃\\localhost使用C:而不是使用.问题似乎与安全设置无关(我从未在我的机器上与CASPOL混淆)而且我使用的是.NET 3.5 SP1,它允许从共享中启动可执行文件.

通过等效的映射网络驱动器函数启动程序的事实应该确认这不是安全问题.

该问题与引用也是EXE程序集的事实无关,因为它通过对普通DLL程序集的引用产生相同类型的加载错误.

有什么可能导致这个装载问题的想法?还有其他人遇到过这样的情况吗?

Mar*_*ell 2

我无法解释“C:\xyz\xyz.core.dll”(除非出于好奇),但其余部分正是我所期望的。

这似乎都与代码访问安全性有关。直到最近,您还需要使用“caspol”来配置 CAS,以允许您从任何类型的网络共享执行exe。这已更改(.NET 3.5 或 .NET 3.5 SP1),以便映射共享(“f:”等)确实获得执行权限,但 UNC 共享则没有。

可以使用“caspol”授予对 UNC 的访问权限(如下所示),但在我看来,切换到 ClickOnce 部署是一个更好的选择。这仍然可以通过网络共享进行,但它包含允许运行时安装它的附加发布信息。我相信它也可以用于部署,以便它可以离线工作(当网络不可用时),但在可能的情况下自动从共享更新我知道这适用于 http 部署 - 我相信适用于网络)。IDE 以“发布”为幌子呈现此内容,大约单击 5 次即可完成。