Исполняемый файл .NET не будет загружать ссылочные сборки при запуске из \\localhost\xyz

Мой исполняемый файл .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.

Любые идеи о том, что может быть причиной этой проблемы с загрузкой? Кто-нибудь еще попадал в такую ​​ситуацию?


person Pierre Arnaud    schedule 29.01.2010    source источник
comment
Ваша трассировка показывает, что общий ресурс \\localhost\xyz сопоставлен с c:\xyz. Это звучит разумно. На что он на самом деле сопоставляется и где находятся сборки?   -  person Hans Passant    schedule 06.02.2010


Ответы (2)


Я не могу объяснить «C:\xyz\xyz.core.dll» (кроме как любопытство), но остальное именно то, что я ожидал.

Кажется, все это связано с безопасностью доступа к коду. До недавнего времени вам нужно было использовать «caspol» для настройки CAS, чтобы вы могли выполнять исполняемый файл с любого типа сетевого ресурса. Это было изменено (либо .NET 3.5, либо .NET 3.5 SP1) таким образом, что сопоставленные общие ресурсы ("f:" и т. д.) делают разрешение на выполнение, а общие ресурсы UNC — нет.

Вы можете использовать "caspol" для предоставления доступа к UNC (вот так), но, по моему мнению, гораздо лучше переключиться на развертывание ClickOnce. Это может по-прежнему осуществляться через сетевую папку, но она включает дополнительную информацию о публикации, которая позволяет среде выполнения монтировать ее. Я полагаю, что его также можно использовать для развертывания таким образом, чтобы оно работало в автономном режиме (когда сеть недоступна), но автоматически обновлялось из общей папки, когда это возможно. /em> это работает для сети). IDE представляет это под видом «публикации», и все делается примерно за 5 кликов.

person Marc Gravell    schedule 03.02.2010

Я запутался - если вы используете localhost, он должен перейти на локальный жесткий диск.

Вы пытаетесь переназначить локальный хост, чтобы указать в другом месте? Если это так, это может быть причиной проблем — попробуйте использовать другое имя.

person mfeingold    schedule 01.02.2010
comment
Нет, проход через \\localhost\share заставляет Windows в какой-то момент пройти через сетевой стек и получить доступ к самому общему ресурсу, а не напрямую к локальному диску. Использование реального имени машины, которую я использую, дает точно такой же результат. - person Pierre Arnaud; 02.02.2010