Ссылка на dll не может быть добавлена

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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

  • Открыть cmd

  • Найдите TlbImp.exe. Возможно, он находится в папке C:\Program Files (x86)\Microsoft SDK\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. Вы можете использовать это как ссылку в своем проекте.

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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

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

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

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

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

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

Ответ 8

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

Ответ 9

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

Первое исключение исключения типа "System.IO.FileNotFoundException" произошло в mscorlib.ni.dll - телефоне Windows

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

Ответ 10

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

Ответ 11

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

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

Ответ 12

Обычно в Visual Studio 2015 вы должны создать проект dll как проект С++ → 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.

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

Ответ 13

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

C:\Projects..\Bin\x86\Debug