Посилання на dll не вдалося додати


95

Коли я додаю файл .dll як посилання в програмі C #, він відображає помилку:

Посилання на ".... dll" не вдалося додати. Будь ласка, переконайтеся, що файл доступний і що це дійсний компонент збірки або COM.

ILDissassembler каже, що немає дійсного заголовка CLR, тому я намагаюся зареєструвати його за допомогою regsvr32, і це видає мені ще одну помилку:

Модуль "" завантажено, але виклик DLLRegisterServer не вдався з кодом помилки "0x80004005"

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

Дякуємо за будь-які підказки / відповіді

Відповіді:


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 Column: Calling Win32 DLLs in C # with P / Invoke". Він був опублікований у випуску журналу MSDN від липня 2010 року. Наразі стаття "Wayback Machine" ( тут форматування обмежена). Весь випуск журналу MSDN за липень 2010 р. Доступний тут (лише формат HCM, інструкції щодо використання файлів HCM тут ).


Чи є спосіб переконатись, що компілятор поміщає .dll у вихідну папку, навіть якщо це не посилання?
Kyle Delaney

1
@KyleDelaney Я не думаю, що компілятор може це зробити. Я б розглянув можливість розміщення команди copy або xcopy у події попередньої збірки / після збірки проекту / рішення. Хоча це вручну, але загалом посилання не змінюються занадто часто, і належний набір тестів повинен враховувати випадки, коли ви забули оновити команди, що виконуються в події попередньої збірки / після збірки.
Манфред

Дякую за відповідь!
Kyle Delaney

Посилання на статтю мертве.
Роальд

@Roald Дякую. Так, посилання справді порушено. Microsoft надає лише формат HCM усього випуску журналу MSDN за іншою URL-адресою. У Wayback Machine також є знімок лише статті у форматі HTML з деяким спрощеним виглядом. Я оновив відповідь, щоб відобразити це, а також видалив недіюче посилання зі своєї відповіді. Сподіваюся, це допомагає.
Манфред

12

Я використовував ходок залежностей, щоб перевірити внутрішні посилання, які мав dll. Виявляється, він потребував часу виконання VB msvbvm60.dll, і оскільки в моєму вікні розробників цього не встановлено, я не зміг зареєструвати його за допомогою regsvr32

Здається, це відповідь на моє початкове запитання наразі.


У моєму випадку мені довелося видалити папку obj для проекту, на який я намагався посилатися, а потім відновив проект.
Толу

7

Переконайтеся, що для вашого компілятора встановлено 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

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


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 .

Просто спробуйте змінити Target Platform на x86 або x64 у Build -> Configuration Manager .


1

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

C: \ Projects .. \ bin \ x86 \ Налагодження


Це було питання для мене також.
rogue39nin

але якщо за замовчуванням не x86 чи x64? але .... "Будь-який процесор" з'явився ...?
гумуру

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).


Solution Explorer> Propertise> Propertise Configuration
Yuresh Karunanayake

@gumuruh Якщо ви маєте на увазі "що таке clr?", то CLR - це docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk

0

Я зіткнувся з подібною проблемою. Я намагався додати посилання на .net 2.0 dll до проекту .Net 1.1. Коли я спробував додати попередню версію .dll, яка відповідала .net 1.1. це працювало на мене.


0

Для тих, хто шукає допомогу з цього питання, або стикається з FileNotFoundException або FirstChanceException, ознайомтесь із моєю відповіддю тут:

Перший випадковий виняток типу 'System.IO.FileNotFoundException' стався в mscorlib.ni.dll - Windows Phone

Взагалі, ви повинні бути абсолютно впевнені, що ви відповідаєте всім вимогам щодо посилання - я знаю, що це очевидна відповідь, але ви, мабуть, не помічаєте порівняно просту вимогу.


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

0

У мене сталася ця помилка під час написання служби Windows. Я запускав Visual Studio від імені адміністратора, щоб мої команди збірки повідомлень автоматично встановлювали мою службу. Я помітив, що коли я все закрив і запустив VS нормально (не як адміністратор), це дозволило мені додати посилання дуже добре, без помилок.

Сподіваюся, це рішення працює для вас.


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 та ВСТАВІТЬ В ПРОЕКТ ВСТАНОВЛЕННЯ (у папці програми).


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.