Ошибка выполнения C # DLL - строится, запускается, но выдает необработанное исключение при попытке использовать функции DLL

Я пытаюсь скомпилировать пример проекта, показанный здесь для C #. Его нужно было преобразовать в VS2010, но это сработало. Он строится, запускается, но затем умирает, когда пытается получить доступ к функции DLL.

Я сделал серию изображений, чтобы показать свои шаги. Как видите, устройство, которое я разработал, подключено и правильно настроено, но я действительно не думаю, что это имеет какое-либо отношение к проблеме. Следующий комментарий внутри файла Form1.cs объясняет, как использовать DLL:

/*
PLEASE NOTE
You must add a reference to the FTChipIDNet.dll in order to use this sample
To do this:
1. Click on Solution explorer tab.
2. Right click the References tree.
3. Choose Add Reference option.
4. Browse to the FTChipIDNet.dll (as a personal preference I place this in my bin directory)
5. Click OK
*/

Я выполнил приведенные выше инструкции, и неопределенная ссылка на пространство имен FTChipID была исправлена. Я также вручную проверил обозреватель объектов, чтобы убедиться, что функция GetNumDevices существует, и она есть.

Нажатие на кнопку вызывает эту ошибку:

DLLNotFoundException не было обработано:

Невозможно загрузить DLL "FTChipID.dll": указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)

в этой строке кода:

FTChipID.ChipID.GetNumDevices(ref numDevices);

Теперь вы можете подумать, что ошибка говорит о том, что ей нужен FTChipID.dll, а не FTChipIDNet.dll. Мне интересно то же самое. У меня есть FTChipID.dll вместе с файлами .lib и .h, но я не знаю, как их использовать и где они должны быть, чтобы эта программа могла их найти. Я попытался добавить ссылку на FTChipID.dll, но VS2010 сказал

Не удалось добавить ссылку на ... \ FTChipID.dll. Убедитесь, что файл доступен и является допустимой сборкой или компонентом COM.

Я тоже не знаю, что это значит. Любые идеи? Заранее спасибо.


person Anthony    schedule 27.12.2011    source источник
comment
вы добавляете .dll как часть ссылки на проект ..? Кроме того, вы используете пространство имен этой .dll .. также изучите версию этой .dll .. или GAC, если необходимо, если .dll - это .net 2.0 - 3.5 .dll по сравнению с .net 4.0 .dll, также посмотрите в настройках свойств для проекта убедитесь, что это проект 4.0. Я бы также попытался скомпилировать его как проект 3.5, чтобы увидеть, в чем различия.   -  person MethodMan    schedule 27.12.2011
comment
Добавьте FTChipID.dll в качестве вывода в свой проект (или скопируйте его в папку bin \ Debug) и повторите попытку. Я предполагаю, что FTChipIDNet.dll - это оболочка для первого.   -  person rene    schedule 27.12.2011
comment
Поместите FTChipID.dll в тот же каталог, что и FTChipIDNET.dll. Фреймворк должен тогда найти его.   -  person M.Babcock    schedule 27.12.2011
comment
Добавьте DLL в свой проект с помощью Project + Add Existing Item. Установите для свойства Копировать в выходной каталог значение Копировать, если оно новее.   -  person Hans Passant    schedule 27.12.2011
comment
Я скопировал FTChipID.dll в папку bin \ Debug. Это вызывает странное поведение. Запуск отладчика внутри VS делает то же самое - он не может найти FTChipID.dll. Однако запуск исполняемого файла вне VS2010 в папке bin \ Debug вызывает новую ошибку. Была сделана попытка загрузить программу с неверным форматом. (Исключение из HRESULT: 0x8007000B).   -  person Anthony    schedule 27.12.2011
comment
Ах да, я забыл сказать, что переход на фреймворк версии 3, 3.5 и 4 не повлиял на поведение до и после добавления FTChipID.dll в проект и папку bin \ Debug.   -  person Anthony    schedule 27.12.2011


Ответы (3)


FTChipIDNet.dll - это оболочка для FTChipID.dll, поэтому вам нужно добавить ссылку на ваше решение (как вы это делали выше), а затем скопировать FTChipID.dll в папку bin, где будет находиться FTChipIDNet.dll.

Обе библиотеки DLL должны находиться в папке bin вашего решения для работы и не должны располагаться в windows \ system32.

person Leons    schedule 27.12.2011
comment
Спасибо. По крайней мере, это привело к другой ошибке. После добавления FTChipID.dll в проект в качестве существующего элемента VS2010 смог найти его при запуске отладчика. Новая ошибка находится в комментарии под моей OP. - person Anthony; 27.12.2011
comment
Вот ссылка, которая может помочь с новым сообщением об ошибке. stackoverflow.com/questions/2023766/ - person Leons; 27.12.2011
comment
Спасибо за ссылку. Прочитав эту ссылку, я спросил у FTDI, выпустили ли они 64-битную версию FTChipID.dll. Менее чем через 20 минут я получил ответ! В настоящее время мы не предлагаем 64-разрядную версию FTChipID.dll. У нас есть пользователи, которые компилируют для 32-битного вывода, и им говорят, что это хорошо работает как в 32-, так и в 64-битных системах. Итак, похоже, мне нужно использовать 32-битную сборку. VS2010 Express не предлагает этого в качестве опции, но я разберусь с этим. Всем спасибо! - person Anthony; 27.12.2011
comment
@Anthony: в свойствах проекта измените Target Framework на 32-разрядный x86. - person SLaks; 28.12.2011

Я создал образец программы FTDI «CSChipID» в VS2013, используя сборку «Any CPU». Два файла DLL «FTChipID.dll» и «FTChipIDNet.dll» были скопированы в каталог bin, но я продолжал получать ошибки при вызове первой функции DLL, «FTChipID.ChipID.GetNumDevices (ref numDevices);» Исправление заключается в изменении сборки на «x86» следующим образом.

Сборка - Configuration Manager Active Solution Platform - «x86» Примечание. Если «x86» недоступен, выберите -New ...-, чтобы выбрать «x86».

person Lawrence Miller    schedule 03.10.2014
comment
да, спасибо, это тоже было причиной моей проблемы, у меня была отладочная сборка моей программы .net. он работал, когда я перестраивал конфигурацию Visual Studio x86 и Release. Это должно быть какая-то проблема с компилятором Visual Studio. Не проблема с dll, потому что у меня уже был FTchip.dll в моей папке c: \ windows \, ​​и он уже работал раньше. - person hamish; 25.11.2015

Похоже, существует несколько .dll: как FTChipIDNet.dll (тот, с которым вы взаимодействуете), так и FTChipID.dll (тот, который имеет фактическую функциональность, не COM, не .NET). Вам нужно и то, и другое.

ПРЕДЛОЖЕНИЕ: Скопируйте оба файла в каталог \ windows \ system32.

person paulsm4    schedule 27.12.2011
comment
вы имеете в виду, пусть у него GAC и то и другое, или скопируйте оба ..? просто интересно узнать ваш ответ. - person MethodMan; 27.12.2011
comment
Файлы приложений редко попадают в каталог System32. - person M.Babcock; 27.12.2011
comment
Да, этот ДЕЙСТВИТЕЛЬНО находится в папке system32, вероятно, потому, что это связанная часть системы драйверов. Пожалуйста, сохраните его в соответствии с оригинальным дизайном драйвера FTDI. C: \ windows \ System32 \ FTChipID.dll Я говорю это, потому что его соседние dll тоже есть C: \ windows \ System32 \ ftd2xx.dll - person hamish; 25.11.2015