VS2010 Ошибка загрузки сборки

При попытке создать проект ASP.NET 4 в Visual Studio 2010 появляется следующая ошибка: "Не удалось загрузить файл или файл сборки":///C:\Dev\project\trunk\bin\Elmah.dll' или одна из его зависимостей. Операция не поддерживается. (Исключение из HRESULT: 0x80131515)".

Я проверил, что dll на самом деле существует и правильно копируется в папку bin. Я также попытался удалить, а затем повторно добавить ссылку на проект.

Сбой сборки возможен только тогда, когда я переключаю Конфигурацию решения на "Выпуск". Не происходит сбой, когда для параметра "Конфигурация решения" установлено значение "Отладка".

Единственное различие между двумя конфигурациями (о которых я знаю) показано в следующем преобразовании Web.config, Web.Release.config:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <connectionStrings>
      <add name="SqlServer" connectionString="" providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
    <system.web>
        <compilation xdt:Transform="RemoveAttributes(debug)" />
        <customErrors mode="On" xdt:Transform="Replace">
            <error statusCode="404" redirect="lost.htm" />
            <error statusCode="500" redirect="uhoh.htm" />
        </customErrors>
    </system.web>
</configuration>

Я пытался использовать Fusion Log Viewer, чтобы отследить проблему привязки сборки, но похоже, что он правильно находит и загружает сборку. Вот журнал:

*** Assembly Binder Log Entry  (6/8/2010 @ 10:01:54 AM) ***

The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable  c:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\sgen.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = User
LOG: Where-ref bind. Location = C:\Dev\project\trunk\bin\Elmah.dll
LOG: Appbase = file:///c:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/bin/NETFX 4.0 Tools/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = sgen.exe
Calling assembly : (Unknown).
===
LOG: This bind starts in LoadFrom load context.
WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load().
LOG: No application configuration file found.
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Attempting download of new URL file:///C:/Dev/project/trunk/bin/Elmah.dll.
LOG: Assembly download was successful. Attempting setup of file: C:\Dev\project\trunk\bin\Elmah.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: Elmah, Version=1.1.11517.0, Culture=neutral, PublicKeyToken=null
LOG: Re-apply policy for where-ref bind.
LOG: Where-ref bind Codebase does not match what is found in default context. Keep the result in LoadFrom context.
LOG: Binding succeeds. Returns assembly from C:\Dev\project\trunk\bin\Elmah.dll.
LOG: Assembly is loaded in LoadFrom load context.

Я чувствую, что с моей стороны совершенно отсутствует понимание того, что именно здесь происходит. Любое объяснение / помощь очень ценится!

4 ответа

Может быть слишком поздно, я столкнулся с этой проблемой. В моем случае я исправил следующие инструкции, которые я нашел в комментарии (Спасибо, Томас!) В этом сообщении.

В комментарии "Developer IT" говорится о том же самом, что и в app.config. На самом деле должно быть в другом месте. Следуйте инструкциям позади.


Еще лучшее решение - "исправить" дистрибутив Microsoft sgen. Сначала найдите sgen (например, в моей системе для.Net 4.0 он находится в "C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools".) Затем создайте файл sgen.exe. конфиг с содержанием:

<configuration> 
  <runtime> 
    <loadFromRemoteSources enabled="true" /> 
  </runtime> 
</configuration> 

Суть в том, что добавление loadFromRemoteResources со значением true в файл конфигурации приложения sgen позволяет sgen правильно загружать файлы с томов ClearCase. Я знаю. Я столкнулся с той же проблемой, и вот как я ее исправил.

Обратите внимание, что в какой-то момент Microsoft может создать файл конфигурации приложения, поэтому, если вы сделаете это, сначала убедитесь, что файл еще не существует, и, если это так, убедитесь, что он все еще нуждается в настройке.


Я понимаю, что это немного поздний ответ, но я только что испытал и исправил ту же проблему с Elmah в режиме релиза (и, как и в случае с OP, режим отладки работал нормально).

Я исправил свою проблему, изменив свойства Elmah.dll в проводнике Windows - на вкладке "Общие" мне пришлось нажать "Разблокировать", чтобы убедить обозревателя, что файл действительно безопасен. После этого режим публикации публикуется нормально.

Согласно блогам здесь и здесь, причина может быть связана с ненадежной сборкой. Если бы это было так, я не могу себе представить, почему это будет работать в одной конфигурации, а не в другой, но это, по крайней мере, на что-то посмотреть.

Проблема может иметь несколько причин.

Представляется уязвимым при загрузке сборок смешанного режима (скомпилированных в режимах "ANY_CPU" и "X86".)

Я изменил параметр компиляции для моей основной программы на "X86", чтобы соответствовать предполагаемому режиму компонентных DLL. Проблема ушла.

Это может быть связано с порядком загрузки файлов dll.

Другие вопросы по тегам