Не удалось добавить ссылку на библиотеку dll



когда я добавляю a .dll файл в качестве ссылки в приложении C# он показывает ошибку:




ссылка "....dll " не удалось добавить.Пожалуйста, убедитесь, что
файл доступен и что это допустимая сборка или COM
деталь.




ILDissassembler говорит, что нет допустимого заголовка CLR, поэтому я пытаюсь зарегистрировать его с помощью regsvr32, и это дает мне еще одну ошибку:




модуль "" был загружен, но вызов DLLRegisterServer не удалось
код ошибки 0x80004005 при'




Я использую версию VS2010 ultimate на 64-битной машине Windows 7. В чем может быть проблема?



Спасибо за любые советы/ответы

1466   15  

15 ответов:

для меня сработало следующее:

короткий ответ:

выполните следующие действия через командную строку (cmd):

TlbImp.exe cvextern.dll        //where cvextern.dll is your dll you want to fix.

и действительная dll будет создана для вас.

более длинный ответ

  • открыть cmd

  • Найти TlbImp.исполняемый. Вероятно, находится в файлах C:\Program (для x86)\Microsoft пакет SDK папке\Windows\В7.\0А Бен. Если вы не можете найти его, перейдите в корневую папку (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 двоичный, например, когда вы используете определенные API Win32. Есть старая статья журнала MSDN, которая может быть полезна. См. следующее обновление для получения информации о том, где получить статью.

Обновление 12 Марта 2018: ссылка на журнал MSDN не работает, как это было в августе 2010 года. Статья Джейсона Кларка называется ".NET Column: вызов Win32 DLL в C# с помощью P/Invoke". Она была опубликована в июльском номере 2010 года журнал MSDN Magazine. В "машине обратного пути" есть статья здесь на данный момент (форматирование ограничено). Весь выпуск журнала MSDN июль 2010 доступен здесь (только формат HCM, инструкции по использованию файлов HCM здесь).

Я использовал Dependency walker, чтобы проверить внутренние ссылки, которые имела dll. Оказывается, он нуждался в VB runtime msvbvm60.dll и поскольку мой dev box не установлен, я не смог зарегистрировать его с помощью regsvr32

Это, кажется, ответ на мой первоначальный вопрос сейчас.

убедитесь, что ваш компилятор установлен на x86, если вы пытаетесь ссылаться на библиотеку dll x86...

У меня были подобные проблемы... как упоминалось выше, попытка использовать OLEDB для доступа к файлу Excel из моего кода C# в Visual Studio 2012.

Я продолжал получать ошибки о том, что библиотека доступа недоступна, но я знал, что загрузил ее.

во время отладки меня осенило, что я компилирую для 64 бит, но загружаю Office x86. Хотя я загрузил Доступ к библиотеке для 32 бит, он никогда не использовался приложением... и был, следовательно, недоступен.

вот что я использовал в C#:

"Provider=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 или x64 архитектура процессора.

просто попробуйте изменить целевую платформу на x86 или x64 на построить -> Configuration Manager.

Я столкнулся с подобной проблемой. Я пытался добавить ссылку на dll .net 2.0 в проект .Net 1.1. Когда я попытался добавить предыдущую версию .dll, которая была выполнена в .Net 1.1. это сработало для меня.

для тех, кто ищет помощь по этому вопросу, или испытывает FileNotFoundException или FirstChanceException, проверьте мой ответ здесь:

произошло первое случайное исключение типа " System. IO. FileNotFoundException mscorlib.ni.dll -windows phone

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

У меня была эта проблема после того, как мой компьютер был перезагружен во время построения решения. Мои две ссылки исчезли, поэтому мне пришлось перестроить два моих проекта вручную, а затем я мог добавлять ссылки без ошибок.

У меня была эта ошибка при записи службы Windows. Я запускал Visual Studio в качестве администратора, чтобы мои команды post build автоматически устанавливали мою службу. Я заметил, что когда я закрыл все и побежал против нормально (не как администратор), это позволило мне добавить ссылки просто отлично без ошибок.

надеюсь, что это решение работает для вас.

обычно в 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 в диспетчере конфигурации и копировать мои 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).

Comments

    Ничего не найдено.