2014-02-19 6 views
2

Привет, я знаю это has been asked, но ответа не получил. У меня есть проблема, когда я хочу использовать DLL, который установлен на C: \ файлы программы (x86) \ Dummu_API.dllКопировать локальный = ложный файл не найден исключение

Когда я запускаю мое приложение он бросает исключение:

Не удалось загрузить файл или сборку 'Dummy_API, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' или одну из его зависимостей. Система не может найти указанный файл.

В моем проекте есть ссылка Copy Local = false и specific version = false. Мой проект также является целевой платформой x86.

Я не знаю, почему мое приложение не находит сборку. Любая идея, что это происходит?

+3

Если это не тот же каталог, что и исполняемый файл, а не в GAC, как вы ожидаете, что ваше приложение найдет его? – Lloyd

+0

В основном, что вы говорите, я не могу ссылаться на Dll из (например) моих документов, если я не установил его в GAC? Как установить Dummy_API в глобальный кэш сборок? – Yoiku

+1

Было бы проще просто развернуть Dummy_API.dll с вашим приложением. Для установки DLL в GAC потребуется, чтобы вы касались каждого компьютера с помощью командной строки. –

ответ

2

Вариант 1

Вы можете сказать приложение, что вы будете разрешить сами Агрегаты, если не нашли в ссылках. Для этого:

В приложениях основной метод присоединять сборки распознаватель:

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 

Убедитесь, что вы не используете динамически разрешенное сборку в основной метод.

Ваш код метода распознаватель (Это где вы загрузить сборку - посмотреть на ResolveEventArgs я просто трудно закодированных один, но вы можете разрешить различные сборки из разных мест здесь)

static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    return Assembly.LoadFile(@"C:\temp\ClassLibrary1.dll"); 
} 

Вариант 2

Добавьте это в app.config (работает только для подпапок базовой директории приложения в)

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <probing privatePath="PathToMyAssemblies\" /> 
    </assemblyBinding> 
</runtime> 
+0

это не сработало. Похоже, что это может сработать, есть еще один способ указать мою программу, где искать сборки? – Yoiku

+2

Извините, я просто прочитал это только для подкаталогов каталога базы приложений. – lahsrah

+0

Хорошо, спасибо вам, это может быть полезно, потому что я могу просто «скопировать локальный» в другой каталог, чтобы я мог скрывать многочисленные DLL, которые мне нужны :) is not решение, но это работа arround – Yoiku

1

Таким образом, файл не находится в GAC, и нет локальной копии. Вы удалили только два места, из которых оно могло быть загружено, - я не знаю, почему вы ожидаете, что это сработает.

Вам необходимо установить Copy Local = true или установить Dummy_API.dll в глобальный кэш сборок на компьютере, на котором будет работать ваш код. Один или другой.

+0

Как установить Dummy_API в глобальный кэш сборок? Но в основном вы говорите, что я не могу ссылаться на Dll из (например) моих документов, если я не установил его в GAC? – Yoiku

+0

@ user2510947 по умолчанию ваш исполняемый файл будет исследовать сборки из GAC, из локального каталога (например,CopyLocal = true) или из зон зондирования, как указано в ответе Лахшры. Он не будет искать машину для Dummy_API.dll в любых других папках. – Jimmy