Ссылка на dll не может быть добавлена - PullRequest
89 голосов
/ 11 августа 2010

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

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

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

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

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

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

Ответы [ 15 ]

49 голосов
/ 28 сентября 2012

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

Краткий ответ

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

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

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

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

  • Open cmd

  • Find TlbImp.EXE.Возможно, находится в C: \ Program Files (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.exe.Вы можете использовать это как ссылку в вашем проекте.
17 голосов
/ 11 августа 2010

Вы можете добавить DLL (или EXE) в проект, только если это сборка .NET. Если это не так, вы увидите это сообщение об ошибке.

regsvr32 также делает определенные предположения о структуре и экспортируемой функции в DLL. Прошло много времени с тех пор, как я его использовал, но это связано с регистрацией COM-серверов, поэтому определенные точки входа должны быть доступны. Если regsvr32 завершается ошибкой, DLL не предоставляет эти точки входа, а DLL не содержит COM-компонент.

Единственный шанс использовать DLL - это импортировать ее, как любой другой бинарный файл, отличный от .NET, например. когда вы используете определенные Win32 API. Есть старая статья в журнале MSDN, которая может оказаться полезной. См. Следующее обновление для получения информации, где взять статью.

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

12 голосов
/ 11 августа 2010

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

. На данный момент это, похоже, ответ на мой первоначальный вопрос.

7 голосов
/ 27 января 2014

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

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

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

Во время отладки меня осенило, что яКомпилирую для 64-битной, но у меня загружен Office x86.Несмотря на то, что я загрузил библиотеку Access для 32-разрядной версии, она никогда не использовалась приложением ... и поэтому была недоступна.

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

"Поставщик = Microsoft.ACE.OLEDB.12.0; Источник данных =" + strFilePath + "; Расширенные свойства = 'Excel 12.0 Xml; HDR = Да'";

... Я получаю сообщение об ошибке

Как только я переключил компилятор на x86, он заработал

2 голосов
/ 12 апреля 2016

У меня та же проблема с импортом 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);

Вы можете добавить это в отдельный проект, а затем добавить ссылку из вашего основного проекта.

2 голосов
/ 03 марта 2015

Я только что столкнулся с этой проблемой, и после всех объяснений по поводу исправления с помощью командной строки я обнаружил, что, если вы добавите его непосредственно в проект, вы можете просто включить библиотеку на каждую нужную страницу

1 голос
/ 21 июля 2017

Вы не можете добавить ссылку на native DLL. Однако вы можете включить их в решение (щелкните правой кнопкой мыши решение, выберите «Добавить существующий файл»), но на них не будут ссылаться, пока вы не объявите что-то вроде

[DllImport("...")]
public static extern void MyFunction();

Может быть, есть какая-то оболочка DLL, на которую вы на самом деле ссылаетесь и которая содержит импорт DLL.

Иногда вы можете ссылаться на DLL-оболочку, но по-прежнему не можете запустить вашу программу, когда сообщение об ошибке предлагает вам убедиться, что файл существует и все зависимости доступны.

Эта проблема связана с тем, что сборка, которую вы пытаетесь добавить, предназначена и скомпилирована только для архитектуры процессора x86 или x64 .

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

1 голос
/ 20 октября 2016

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

0 голосов
/ 30 июля 2018

У меня была такая же проблема, когда я пытался добавить DLL, которую я только что закодировал. Оказалось, мне нужно было установить свойства проекта, из которого моя dll:

  • Configuration Properties\General\Common Language Runtime Support: /clr
  • Configuration Properties\C/C++\General\Common Language RunTime Support: /clr

Поскольку проект, в котором я хотел использовать эту dll, также был настроен таким же образом (для него были установлены те же свойства, что и для /clr).

0 голосов
/ 17 марта 2018

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

В моем случае после обновления библиотеки nuget, которая ссылалась на другую библиотеку, вызвавшую проблему, проблема исчезла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...