2009-06-01 7 views
10

Я работаю над системой, использующей SqlServerCe с NHibernate. Из моей программы драйвера, если я добавлю сборку System.Data.SqlServerCe в качестве ссылки, я могу просто создавать и запускать запросы к базе данных. При попытке использовать NHibernate, хотя, я получаю следующее исключение:Не удалось загрузить файл или сборку

Первый шанс исключение типа «System.IO.FileNotFoundException» произошло в mscorlib.dll Дополнительная информация: Не удалось загрузить файл или сборку «системы. Data.SqlServerCe 'или одну из его зависимостей. Система не может найти указанный файл.

Я проследил исключение на вызов Assembly.Load («System.Data.SqlServerCe»), который, похоже, должен работать. Узел System.Data.SqlServerCe находится в GAC (я также попытался добавить его в качестве локальной ссылки с CopyLocal = true, безрезультатно), и я могу использовать его членов в порядке, поэтому почему я не могу явно загружать Это? Когда я открываю сборку в Reflector, у нее возникает проблема с загрузкой ссылки System.Transactions (я также попытался добавить ее как локальную ссылку, опять же безрезультатно), поэтому загрузка этой сборки может быть проблемой, а не системой. Сборка Data.SqlServerCe.

Это обычная проблема? Возможно, неправильная конфигурация системы?

+0

Похоже, вы никогда не слышали о Fusion: http://www.hanselman.com/blog/BackToBasicsUsingFusionLogViewerToDebugObscureLoaderErrors.aspx – zvolkov

+0

Ооо, аккуратный инструмент. Отклики, которые он мне дает, это: LOG: То же самое связывание было замечено раньше, и не получилось с hr = 0x80070002. ERR: Неисправляемая ошибка произошла во время предварительной загрузки (hr = 0x80070002). Это не похоже на то, что полезно - раньше это не удавалось, так что давайте снова потерпим неудачу? Мне нужно читать документы о слиянии, чтобы, надеюсь, понять это немного лучше. Я указал на решение моей проблемы, однако - подробности ниже. – Dathan

ответ

8

По-видимому, это можно решить, добавив элемент <qualifyAssembly> в файл app.config. Добавление следующего приложения работает нормально:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <qualifyAssembly partialName="System.Data.SqlServerCe" fullName="System.Data.SqlServerCe, Version=3.5.1.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" /> 
    </assemblyBinding> 
</runtime> 

Спасибо!

+0

Да, полное имя, указанное выше, действительно является полным именем для сборки. Он предоставляет CLR информацию, необходимую для поиска и загрузки конкретной сборки. Вы также можете заменить это fullName в строке подключения в файле .config (вместо partialName) – nocache

1

У меня была аналогичная проблема. Ошибка, которую я делал, заключалась в том, что я пытался выполнить .exe, присутствующий в файле ../obj/x86/Release, тогда как я должен выполнить .exe, присутствующий в ../bin/Release. (Я абсолютный новичок на C#).

(я также заметил, что в этом каталоге ../bin/Release, упоминаемая .dll файл копируется локально.)

2

Это наиболее вероятно, связано с какой-либо системы (MIS) конфигурации.

Однако по дизайну SQL Server CE представляет собой всего лишь одну DLL-версию, которая может быть отправлена ​​вместе с вашим продуктом.
Это означает, что вы можете просто установить Copy local в True в ссылочные свойства System.Data.SqlServerCe, и все готово.

+0

Он отлично работал для меня! Благодарю. –

Смежные вопросы