(System.IO.FileNotFoundException) .Net Core Web API не может найти дочернюю зависимость (Зависимости зависимости) при добавлении DLL с помощью «Добавить ссылку» - PullRequest
0 голосов
/ 29 марта 2019

Я получаю System.IO.FileNotFoundException в моем .Net Core Web API.Поэтому я настроил приведенный ниже проект для демонстрации проблемы.

Я создал стандартную библиотеку .Net с именем DemoLibrary и добавил зависимость QRCoder через NuGet.

Отказ от ответственности: причина выбора QRCoder заключается в том, что веб-API не использует его по умолчанию.Я не использую это в своем проекте.Фактически я получаю это исключение для EntityFrameworkCore.

Я создал новый .Net Core Web API DemoWebAPI , который не имеет других зависимостей.

Тогдадобавил DemoLibrary к DemoWebAPI через Добавить ссылку -> Обзор -> DemoLibrary.dll.

Это мое решение:

enter image description here

Метод DemoMethod в классе Calculate просто создает объект QRCodeGenerator.

public class Calculate
{
    public static string DemoMethod()
    {
        QRCodeGenerator qrGenerator = new QRCodeGenerator();
        return "";
    }
}

А мой ValuesController в DemoWebAPI просто вызывает метод:

[HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2", DemoLibrary.Calculate.DemoMethod()  };
    }

Теперь, когда я запускаю проект DemoWebAPI, я получаюниже исключение при вызове DemoMethod:

System.IO.FileNotFoundException: «Не удалось загрузить файл или сборку» QRCoder, версия = 1.3.5.0, культура = нейтральная, PublicKeyToken = null '.Системе не удается найти указанный файл. '

Я понимаю, что мне нужно скопировать куда-нибудь файл QRCoder.dll .Но я не понимаю, куда это поставить.Я уже пытался поместить его в "bin / debug / netcoreapp2.2" из DemoWebAPI и "bin / debug / netstandard2.0" из DemoLibrary.

Но я не смог заставить его работать.

Запрос: Пожалуйста, опишите свой ответ как можно более наглядно, потому что я новичок в .Net Core.

Редактировать : Мне известны серверы NuGet.Я читал такие темы, как размещение сервера NuGet в IIS и Azure.Причиной ссылки на DLL является то, что я хочу использовать свои библиотеки DLL в двух проектах, один из которых - API ядра .net, а другой - библиотека классов .net framework, скомпилированная NMAKE.Я не смог найти способ восстановить пакеты NuGet в файлах .MAK.

1 Ответ

0 голосов
/ 29 марта 2019

Похоже, вы просто добавили DLL для DemoLibrary в ваш DemoWebApi проект.Это не то, как вы должны добавлять ссылки.Поскольку они находятся в одном решении, вы должны добавить ссылку на проект.Это решит вашу проблему.

Теперь позвольте мне объяснить, что на самом деле здесь происходит.Ваш DemoLibrary зависит от QRCoder.Это ссылка на NuGet, которая означает, что пакет будет восстановлен (т.е. загружен) и включен в вывод DemoLibrary сборки.Тем не менее, он будет включен как одна или несколько DLL вместе с вашей DemoLibrary.dll.Когда вы просто ссылаетесь на DemoLibrary.dll, вы упускаете все остальные библиотеки DLL, которые являются частью DemoLibrary, и, следовательно, все не работает должным образом.

Теперь, когда речь заходит о ссылке на проект,все немного сложнее.Ссылка на проект по существу оборачивает ссылочный проект в ваш другой проект.Вы можете думать об этом как о каком-то подпроекте.В сущности, любая зависимость подпроекта становится зависимостью основного проекта.Это означает, что DemoWebAPI теперь технически имеет ссылку на пакет NuGet на QRCoder, хотя в его файле проекта нет явной ссылки на пакет.Зависимость исходит от вашего DemoLibary проекта.Таким образом, со ссылкой на проект будут включены все необходимые зависимости, потому что это как если бы основной проект включал их сами в виде подпроекта.

Для чего бы это ни стоило, вы фактически никогда не должны включатьDLL в качестве ссылки напрямую.Раньше это требовалось, но концепция пакетов NuGet практически устранила эту практику.Даже если DemoLibrary не был в том же решении, что и DemoWebAPI (что означает, что вы больше не можете делать ссылку на проект), правильный способ его использования - превратить DemoLibary в пакет NuGet, а затем ссылаться на него вDemoWebAPI через ссылку на пакет, как и любой другой пакет NuGet.Вы не просто добавляете DLL.

...