Загрузка библиотек DLL с помощью Microsoft Visual C# 2010 Express

Я использую Microsoft C# 2010 Express с драйверами FrameLink Express от Imperx. Когда я пытаюсь загрузить DLL во время выполнения, я получаю исключение:

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

Если я попытаюсь добавить DLL в качестве ссылки, я получаю это сообщение:

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

Два вопроса:

  1. Является ли это проблемой Express (т. е. какое-то ограничение, связанное с Express, вызывающим проблему)? Я считаю, что исходный код DLL написан на C++, но я не думаю, что это имеет значение.

  2. Есть ли другой способ сослаться на DLL и/или добавить ее в проект? Что-то я делаю не так?

Наконец, я попытался добавить версии x86 и x64, отладку и выпуск. Один и тот же сбой при добавлении в качестве ссылки каждый раз.


person GrandAdmiral    schedule 14.10.2012    source источник


Ответы (2)


Эта DLL не является кодом .NET (или COM), поэтому вы не можете ни загрузить ее, ни добавить ссылку на нее.

Не имеет ничего общего с вашей версией Express - это просто не "совместимая" с .NET DLL, и поэтому вы не можете загружать или ссылаться на нее.

Чтобы использовать его функциональность, вам, вероятно, придется погрузиться в более «загадочные» (и более сложные и сложные) методы вызова необработанного кода C++ из .NET — или найти его аналог или версию, совместимую с .NET.

person marc_s    schedule 14.10.2012
comment
Сомнительно, что я смогу получить версию, совместимую с .NET, но приятно знать, что с Express это не проблема. Не могли бы вы указать мне на тайные методы? В настоящее время я использую DLLImport для любой функции, которую хочу вызвать. - person GrandAdmiral; 15.10.2012
comment
@GrandAdmiral: это в основном путь, да - см. эту статью MSDN на платформе Вызов (p/invoke) для взаимодействия с неуправляемыми библиотеками кода - person marc_s; 15.10.2012
comment
Это то, что я делал... к сожалению, когда я добавил его в проект (в виде файла), я не настроил его для копирования файла в место выполнения. Глупая ошибка. Спасибо всем за помощь! - person GrandAdmiral; 15.10.2012

На самом деле ответ содержится в первой строке сообщения: Невозможно загрузить DLL «VCECLB.dll»: указанный модуль не найден. (Исключение из HRESULT: 0x8007007E. В нем говорится, что не удается найти DLL, а не в том, что DLL несовместима. DLL должна находиться с другими DLL вашей программы, и вам нужно добавить DLL в решение.

Если по какой-то причине DLL скомпилирована как Native C/C++ (т. е. не в стиле .NET), ее можно вызвать из C/C++, который является стилем .NET, но не подпрограммой C#.

Таким образом, если проблема заключается в том, что модуль может быть найден, но не загружен, вам нужно написать подпрограмму C++ (.NET) для вызова из вашей подпрограммы C# (.NET) для вызова C++ (не .NET).

Весь код, который взаимодействует напрямую с оборудованием, должен делать это на каком-то уровне. Большинство из них делают это за вас, используя несколько библиотек DLL.

person Richard Hillery    schedule 19.10.2016