Не может добавить ссылку .NET

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

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

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

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

У меня есть и x64, и x86 DLL, и я не могу их добавить. Почему это происходит?

Ответ 1

Вы не можете добавлять неуправляемые библиотеки DLL в качестве ссылок в Visual Studio, независимо от 32/64 "bittyness". И я сомневаюсь, что он работал на вашей машине x86.

Есть разница между "нормальными" DLL и COM-DLL.

Вы можете добавить ссылку на COM-DLL после ее регистрации в системе (на самом деле вы ссылаетесь на открытый COM-объект, и ссылка на DLL добавляется автоматически). Это можно сделать на "COM" -Tab диалогового окна "Добавить ссылку" (здесь вы должны убедиться, что в большинстве случаев ваш проект построен как цель x86).

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

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

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

Ответ 2

На ваш вопрос есть ответы multiple:

  • вы можете столкнуться с этой проблемой, потому что сборка, которую вы пытаетесь добавить, нацелена и скомпилирована для архитектуры процессора x86. Просто попробуйте изменить целевую платформу от x64 до x86, и даже если этот постулат работает, попробуйте изменить его на AnyCPU. Платформа AnyCPU Platform делает ваше приложение исполняемым для обоих типов архитектуры, потому что оно без архитектуры.

  • Если сборка является DLL, и ее нельзя добавить в качестве ссылки, то она не COM, а также .NET. Это будет родная сборка, как и другие (например, shell32.dll, user32.dl и т.д.). Вы должны использовать их с помощью атрибута DllImport, но сначала вы должны проверить документацию документации этой DLL, чтобы получить список функций, реализованных в этой DLL.

Ответ 3

Возможно, может помочь Импортщик библиотеки типов (Tlbimp.exe). Он создает оболочку .NET dll. Оригинальная COM-библиотека DLL должна быть там и должна быть зарегистрирована! (Попробуйте сначала зарегистрировать его, прежде чем попробовать его с помощью TlbImp.)

Если 64-разрядная версия не работает, установите целевую платформу x84 в свойствах сборки проекта.

Ответ 4

Некоторые DLL нельзя добавить в качестве ссылки, но, тем не менее, они все еще могут использоваться С# со знаменитым [DllImport( params go here...)]

Вам также может понадобиться inspect dll, чтобы получить адрес функций, которые вы хотите использовать. Это может быть достигнуто с помощью GetProcAddress

Ответ 5

Добавить абсолютный путь к dll в DllImport

Ответ 6

пытаясь проанализировать проблему, я обнаружил следующее

[1] иногда вы видите ссылку в диспетчере ссылок, но вы не найдете DLL файлы в указанном каталоге, где диспетчер ссылок не может актуализировать ссылки.

[2] проверьте разрешение вашего файла dll.

Ответ 7

Попробуйте изменить целевую платформу с любого процессора на x86. (свойства проекта → Build → Platform Target)