Как я могу решить "Пожалуйста, убедитесь, что файл доступен и является допустимой сборкой или компонентом COM"?

272
27

Я строю проект с OpenCV в С#. Для этого требуется файл dll с именем cvextern.dll. но при добавлении этого файла в качестве ссылки появляется следующее сообщение: -


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


Я устал от поиска, я провел последние 2 дня в поиске решения этой проблемы

спросил(а) 2011-08-16T18:06:00+04:00 9 лет, 1 месяц назад
1
Решение
202

файл является родной DLL, что означает, что вы не можете добавить его в .NET-проект через Add Reference... вы можете использовать его через DllImport (см. http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx)

ответил(а) 2011-08-16T18:13:00+04:00 9 лет, 1 месяц назад
202

В моем случае мне пришлось зарегистрировать .dll.

Для этого откройте cmd.exe (консоль) с правами администратора и введите:

regsvr32 "foo.dll"

ответил(а) 2013-04-05T14:24:00+04:00 7 лет, 5 месяцев назад
120

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


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


выполните следующую команду через командную строку (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. Вы можете использовать это как ссылку в своем проекте.

ответил(а) 2012-09-28T15:05:00+04:00 7 лет, 12 месяцев назад
89

Убедитесь, что необходимые DLL файлы экспортированы (или скопированы вручную) в папку bin при создании приложения.

ответил(а) 2011-08-16T18:27:00+04:00 9 лет, 1 месяц назад
79

У меня была такая же программа, я надеюсь, что это может помочь.


Я использую Windows 7, откройте "Командная строка" → "Администратор". зарегистрируйте свою <... > . dll.


Зачем запускать в качестве администратора, вы можете зарегистрировать вашу <... > . dll с помощью запуска в Windows Start, но все же ваша dll будет запускаться только как пользователь, даже если ваша учетная запись является администратором.


Теперь вы можете добавить свою <... > . dll в Project- > Add Reference- > Browse


Спасибо

ответил(а) 2014-07-07T09:42:00+04:00 6 лет, 2 месяца назад
58

'Для этого требуется файл dll cvextern.dll. "Это может быть ваш собственный файл cs или какая-либо другая сторонняя dll, которую вы используете в своем проекте.


Чтобы вызвать собственные DLL файлы в собственный файл cs, скопируйте dll в каталог root\lib проекта и добавьте его как существующий элемент. (Добавить -Исходящий элемент) и использовать Dllimport с правильным местоположением.


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


После сборки убедитесь, что необходимые DLL файлы появляются в папке Build. В некоторых случаях он может не отображаться или заменяться в папке "Сборка". Удалите папку Build вручную и снова создайте.

ответил(а) 2017-12-21T02:40:00+03:00 2 года, 9 месяцев назад
56

Ищите здесь ответ от TheMattster. Я реализовал это, и это сработало как шарм. В двух словах, его решение предлагает добавить COM-библиотеку в качестве ресурса в проект (так что теперь он компилируется в DLL файл проекта), и при первом запуске записать его в файл (т.е. Файл DLL, который я хотел там в первом место).

Следующее взято из его ответа.

Шаг 1) Добавьте DLL в качестве ресурса (ниже как "Resources.DllFile"). Для этого откройте свойства проекта, выберите вкладку ресурсов, выберите "добавить существующий файл" и добавьте DLL в качестве ресурса.

Шаг 2) Добавьте имя библиотеки DLL в качестве строкового ресурса (ниже как "Resources.DllName").

Шаг 3) Добавьте этот код в основную форму загрузки:

if (!File.Exists(Properties.Resources.DllName))
{
var outStream = new StreamWriter(Properties.Resources.DllName, false);
var binStream = new BinaryWriter(outStream.BaseStream);
binStream.Write(Properties.Resources.DllFile);
binStream.Close();
}

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

ответил(а) 2015-12-23T06:39:00+03:00 4 года, 9 месяцев назад
40

В моем случае у меня также есть неуправляемая DLL (C++) в рабочей области, и если вы укажете:

<files>
<file src="bin\*.dll" target="lib" />
</files>

Nuget будет пытаться загрузить каждую DLL как сборку, даже библиотеки C++! Чтобы избежать такого поведения, определите ваши сборки С# с тегом references:

<references>
<reference file="Managed1.dll" />
<reference file="Managed2.dll" />
</<references>

Замечание: родительские ссылки - это метаданные → в соответствии с документацией https://docs.microsoft.com/en-us/nuget/reference/nuspec#general-form-and-schema

Документация: https://docs.microsoft.com/en-us/nuget/reference/nuspec

ответил(а) 2019-05-06T16:42:00+03:00 1 год, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема