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

95

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

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

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

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

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

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

user20358
источник

Ответы:

53

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

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

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

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

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

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

  • Открыть cmd

  • Найдите 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
  • В той же папке с tlbimp.exe создана новая dll. Вы можете использовать это как ссылку в своем проекте.
Мемет Олсен
источник
5
Другой способ получить доступ к TlbImp.exe - открыть командную строку Visual Studio.
Скотт
75
@Memet Afer пытается это у меня есть, есть TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.предложения?
Динешкумар
1
Входной файл C: \ Windows \ SYSTEM32 \ SqlServerSpatial.dll 'не является допустимой библиотекой типов
Кристина
7
Имея ту же ошибку, что и Динешкумар Поннусами. Пожалуйста, помогите мне
deathrace
1
Когда вам нужно использовать TLBMP? Обычно в VS2015, если вы просто добавляете ссылку на COM DLL из окна ссылок, он обо всем позаботится за вас.
UuDdLrLrSs
20

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

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

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

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

Манфред
источник
Есть ли способ убедиться, что компилятор помещает .dll в выходную папку, даже если это не ссылка?
Кайл Делани
1
@KyleDelaney Я не думаю, что компилятор может это сделать. Я бы подумал о том, чтобы поместить команду copy или xcopy в событие перед сборкой / после сборки проекта / решения. Тем не менее, это руководство, но, как правило, ссылки не меняются слишком часто, и правильный набор тестов должен улавливать случаи, когда вы забыли обновить команды, выполняемые в событии перед сборкой / после сборки.
Манфред,
Спасибо за ответ!
Кайл Делани
Ссылка на статью мертва.
Роальд
@ Роальд Спасибо. Да, ссылка действительно не работает. Microsoft предоставляет только формат HCM для всего выпуска MSDN Magazine по другому URL-адресу. На Wayback Machine также есть снимок только статьи в формате HTML с некоторым упрощенным оформлением. Я обновил ответ, чтобы отразить это, и я также удалил неработающую ссылку из своего ответа. Надеюсь это поможет.
Manfred
12

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

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

user20358
источник
В моем случае мне пришлось удалить папку obj для проекта, на который я пытался сослаться, а затем я перестроил проект.
Толу
7

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

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

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

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

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

"Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" + strFilePath + "; Extended Properties = 'Excel 12.0 Xml; HDR = Yes'";

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

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

Роберт Обергфолл
источник
2

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

JeffB
источник
2

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

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

Сашу
источник
1

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

Рафаль Сайпсер
источник
1

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

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

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

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

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

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

Леон Вольф
источник
1

Мне нужно архитектуры изменений на x86 от x64 в диспетчере конфигурации и скопировать мой 32 бит DLL (язык C - pcProxAPI.dll) в новую папку это созданный .. Это на вершине шагов , описанных в «Sashus» ниже .

C: \ Projects .. \ bin \ x86 \ Debug

боатенг
источник
Это было его проблемой и для меня.
rogue39nin 08
а если по умолчанию не x86 и не x64? но .... "Any Cpu" обнаружился ...?
gumuruh
codeproject.com/articles/1160645/… Любой процессор может работать, если вы скопируете туда 32-битную dll
boateng
1

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

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

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

LoukMouk
источник
Обозреватель решений> Свойства> Свойства конфигурации
Юреш Карунанаяке
@gumuruh Если вы имеете в виду «что такое clr?», то CLR - это docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk,
0

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

user2623151
источник
0

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

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

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

JHaps
источник
Посмотрите на различия между версиями фреймворка по сравнению с эталоном - в большинстве случаев использование более новой версии фреймворка не должно иметь никакого значения.
JHaps
0

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

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

Fütemire
источник
0

Обычно в Visual Studio 2015 вы должны создать проект dll как проект C ++ -> CLR из шаблонов Visual Studio, но вы можете технически включить его постфактум:

Критическое свойство называется Common Language Runtime Supportустановленным в конфигурации вашего проекта. Он находится под Configuration Properties > General > Common Language Runtime Support.

При этом VS, вероятно, не будет обновлять параметр «Target .NET Framework» (как и должно). Вы можете добавить это вручную, выгрузив проект, отредактировав файл your_project.xxproj и добавив / обновив Target .NET framework Versionтег XML.

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

Аарон Халл
источник
0

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

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

Мартин Штауфчик
источник
0

Вы можете добавить файл .dll вручную. Например, если вы хотите добавить файл dll в свое приложение WPF и не можете ссылаться на него в своем проекте

(Получение ошибки: не удалось добавить ссылку на «.... dll». Убедитесь, что файл доступен и является допустимой сборкой или компонентом COM),

затем СКОПИРУЙТЕ этот файл dll и ВСТАВЬТЕ в ПРОЕКТ УСТАНОВЩИКА (в папку приложения).

АРУН ДЖОН
источник
0
  1. запустите cmd.exe и введите:
  2. Regsvr32% dllpath%
  3. "% dllpath%" заменить на путь к вашей dll.
Чарльз Чен
источник