Не удалось добавить ссылку на dll
когда я добавляю .dll-файл в качестве ссылки в приложении c# показывает ошибку:
ссылка "....dll " не удалось добавить.Пожалуйста, убедитесь, что файл доступен и является допустимой сборкой или COM деталь.
ILDissassembler говорит, что нет допустимого заголовка CLR, поэтому я пытаюсь зарегистрировать его с помощью regsvr32, и это дает мне еще одну ошибку:
модуль "" был загружен, но вызов DLLRegisterServer не удалось код ошибки 0x80004005 при'
Я использую версию VS2010 ultimate на 64-битной машине Windows 7. В чем может быть проблема?
Спасибо за любые советы/ответы
15 ответов
для меня сработало следующее:
короткий ответ:
выполните следующие действия через командную строку (cmd):
TlbImp.exe cvextern.dll //where cvextern.dll is your dll you want to fix.
и для вас будет создана допустимая dll.
более длинный ответ
открыть cmd
-
Найти TlbImp.исполняемый. Вероятно, находится в C:\Program файлы (x86)\Microsoft SDKs\Windows\v7.0A\Bin. Если вы не можете найти его, перейдите в корневую папку (C:\ или D:) и беги:
dir tlbimp.exe /s //this will locate the file.
-
запустить программу tlbimp.exe и поместите свою dll за него. Пример: если ваша dll является cvextern.файл DLL. Вы можете запустить:
TlbImp.exe cvextern.dll
- новая dll была создана в той же папке tlbimp.исполняемый. Вы можете использовать это в качестве ссылки в своем проекте.
вы можете добавить DLL (или EXE) в проект, только если это сборка .NET. Если это не так, вы увидите это сообщение об ошибке.
regsvr32 также делает определенные предположения о структуре и экспортируемой функции в DLL. Прошло некоторое время с тех пор, как я использовал его, но это связано с регистрацией COM-серверов, поэтому определенные точки входа должны быть доступны. Если regsvr32 терпит неудачу, DLL не предоставляет эти точки входа, а DLL не содержит com-компонент.
вы только шанс использования DLL-импортировать его, как и любой другой non-.NET двоичный, например, при использовании определенных Win32 API. Существует старая статья журнала MSDN, которая может быть полезна. См. следующее обновление для получения информации о том, где получить статью.
Обновление 12 Марта 2018: ссылка на журнал MSDN не работает, как это было в августе 2010 года. Статья Джейсона Кларка называется ".NET Column: вызов Win32 DLL в C# с P/Invoke". Он был опубликован в июльском номере 2010 года журнал MSDN Magazine. В "Wayback Machine" есть статья здесь на данный момент (форматирование ограничено). Весь выпуск журнала MSDN июль 2010 доступен здесь (только формат HCM, инструкции по использованию файлов HCM здесь).
Я использовал dependency walker для проверки внутренних ссылок, которые имела dll. Оказывается, он нуждался в среде выполнения VB msvbvm60.dll и так как мой dev box не установлен, я не смог зарегистрировать его с помощью regsvr32
Это, кажется, ответ на мой первоначальный вопрос сейчас.
убедитесь, что ваш компилятор установлен в x86, если вы пытаетесь ссылаться на x86 dll...
У меня были похожие проблемы... как упоминалось выше, попытка использовать OLEDB для доступа к файлу Excel из моего кода C# в Visual Studio 2012.
Я продолжал получать ошибки о том, что библиотека Access недоступна, но я знал, что загрузил ее.
во время отладки меня осенило, что я компилирую для 64 бит, но загрузил Office x86. Хотя я загрузил Доступ к библиотеке для 32 бит, он никогда не использовался приложением... и поэтому был недоступен.
вот что я использовал в C#:
"Поставщик=Microsoft.ТУЗ.Oledb для.12.0; источник данных= " + strFilePath +"; расширенные свойства='Excel 12.0 Xml; HDR=Yes'";
...Я получал сообщение об ошибке
Как только я переключил компилятор для x86 он работал
Я просто столкнулся с этой проблемой, и после всех объяснений о ее исправлении с помощью командной строки я обнаружил, что если вы добавите ее непосредственно в проект, вы можете просто включить библиотеку на каждой странице, что это необходимо
У меня такая же проблема с импортом WinSCard.dll в моем проекте. Я имею дело с этим импортом непосредственно из dll, как это:
[DllImport("winscard.dll")]
public static extern int SCardEstablishContext(int dwScope, int pvReserved1, int pvReserved2, ref int phContext);
[DllImport("winscard.dll")]
public static extern int SCardReleaseContext(int phContext);
вы можете добавить это в отдельный проект, а затем добавить ссылку из своего основного проекта.
вы не можете добавить ссылку на уроженца DLL. Однако вы можете включить их в решение (щелкните правой кнопкой мыши решение, выберите "Добавить существующий файл"), но они не будут ссылаться, если вы не объявите что-то вроде
[DllImport("...")]
public static extern void MyFunction();
может быть, есть какой-то фантик DLL, на которую вы фактически ссылаетесь и которая содержит импорт DLL.
иногда вы можете ссылаться на DLL-оболочку, но все равно не можете запустить свою программу, где подсказка об ошибке предлагает вам убедиться, что файл существует и все зависимости доступны.
эта проблема заключается в том, что сборка, которую вы пытаетесь добавить, является целевой и компилируется только для x86 или х64 архитектура процессора.
просто попробуйте изменить целевую платформу на x86 или х64 на построить ->Configuration Manager.
Я столкнулся с аналогичной проблемой. Я пытался добавить ссылку на dll .net 2.0 в проект .Net 1.1. Когда я попытался добавить предыдущую версию .dll, который был соблюден в .Net 1.1. у меня получилось.
для тех, кто ищет помощь по этому вопросу, или испытывает FileNotFoundException или FirstChanceException, проверьте мой ответ здесь:
В общем, вы должны быть абсолютно уверены, что вы отвечаете всем требованиям для создания ссылки - я знаю, что это очевидный ответ, но вы, вероятно, упускаете из виду относительно простое требование.
У меня была эта проблема после того, как мой компьютер был перезагружен во время построения решения. Мои две ссылки исчезли, поэтому мне пришлось перестроить два моих проекта вручную, а затем я мог добавить ссылки без ошибок.
У меня была эта ошибка при записи службы Windows. Я запускал Visual Studio как администратор, чтобы мои команды сборки post автоматически устанавливали мою службу. Я заметил, что когда я закрыл все и запустил VS нормально (не как администратор), это позволило мне добавить ссылки просто отлично без ошибок.
надеюсь, что это решение работает для вас.
обычно в Visual Studio 2015 вы должны создать проект dll как проект C++ -> CLR из шаблонов Visual Studio, но вы можете технически включить его после того, как факт:
критическое свойство называется Common Language Runtime Support
в настройках Вашего проекта. Он найден под Configuration Properties > General > Common Language Runtime Support
.
при этом VS, вероятно, не обновит параметр "Target .NET Framework" (как и должно быть). Вы можете вручную добавить это, выгрузив свой проект, отредактировав ваш проект.файл xxproj и добавление / обновление Target .NET framework Version
тег XML.
для примера я предлагаю создать новое решение в качестве проекта C++ CLR и изучить XML там, возможно, даже дифференцировать его, чтобы убедиться, что нет ничего очень важного, что выходит за рамки обычного.
Мне нужно было изменить архитектуру на x86 из x64 в configuration manager и скопировать мою 32 - битную dll (язык C-pcProxAPI.dll) в новую папку, созданную этим.. Это на верхних ступенях лестницы, описанный "Sashus" ниже.
C:\Projects..\bin\x86\Debug
мой ответ немного запоздал, но в качестве быстрого теста убедитесь, что вы используете последнюю версию библиотек.
в моем случае после обновления библиотеки nuget, которая ссылалась на другую библиотеку, вызывающую проблему, проблема исчезла.
у меня была та же проблема, когда я пытался добавить dll, которую я только что закодировал. Оказалось, мне нужно было установить свойства проекта, из которого моя dll:
Configuration Properties\General\Common Language Runtime Support: /clr
Configuration Properties\C/C++\General\Common Language RunTime Support: /clr
потому что проект, в котором я хотел использовать эту dll, также был установлен так (имел те же свойства, что и /clr
).