Ссылка на 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