Использование чужого кода в своем проекте (и подключение сторонних DLL)

А вот с этим связана вторая часть вопроса.
Что если я соберу его файл как библиотеку и подключу к своему проекту?
Тогда получится, что библиотека будет собрана в режиме Release, а свой проект я уже не смогу собрать в режиме Debug (и наоборот)? Или можно так?

Можно.
Ну и если библиотека как проект в том же солюшне, то тогда можно и пересобирать всё сразу в любом режиме.

Нет, я говорю про подключение DLL-файла отдельно. У меня тоже есть проекты типа YouTube API, Twitch API, которые собираются как библиотека. Не подключать же их ко всем, использующим их, проектам (солюшенам)? :man_shrugging: Или так и делают? :thinking:

Ну так и что делать-то? :man_shrugging:
Как подключать библиотеки к проектам, не подключая в солюшен сам проект библиотеки?

А как их туда залить? Там же модерацию какую-то надо проходить, или что? :thinking: У меня же библиотеки на очень ранней стадии разработки (по факту, это быдлокод). Разве нет другого способа подключения, кроме как сразу заливать их в репозиторий? :thinking: Чёт я этот момент не понял :man_shrugging:

Вряд ли там есть ручная модерация. Просто создать пакет, загрузить, подождать несколько минут.

Достаточно просто создать .nuspec файл с описанием проекта и что где брать (для обычных библиотек вроде даже не надо указывать где длл брать, само найдет), вызвать NuGet утилиту, загрузить на сайте полученный пакет.

Типа как тут минималистичные пакеты без всего лишнего (разных платформ, полной автоматизации создания): https://github.com/jbaranda/nupkg-selenium-webdrivers

Или оф. пример: Create and publish a .NET Framework NuGet package using Visual Studio on Windows | Microsoft Docs

В других языках не требующих компиляции можно просто гит репозиторий подключить как пакет. Тут этого нет потому что проект надо собирать и не всегда просто.

Но можно сделать NuGet репозиторием хоть папку на своем компе. Где-то в настройках добавить путь и пакеты из папки появятся в списке при поиске и т.д.

А как?
https://andrey.moveax.ru/post/tools-nuget-part2-local-repository
Так, чтоли? :thinking: Это, вроде, глобальные настройки. То есть, он будет часть тянуть из интернета, а чего там нет - из локального?

Да.

Ок, потом буду пробовать. А сейчас третья часть вопроса.
Я в NuGetе нашел пакет Imazen.WebP. Это то же самое, как в первом посте (тоже обёртка), только она есть в NuGetе. При запуске программы пишет Failed to locate 'libwebp.dll'.
Где её взять и как подключить к проекту? Чёт я гуглил и не нашёл :man_shrugging:

Просто положить туда, где она будет найдена. То есть обычно рядом с программой или в системных папках указанных в PATH.
Можно добавить в проект как любой файл и включить опцию про копирование.

Брать видимо где-то тут Downloading and Installing WebP  |  Google Developers

Ну это ясен хрен :grin:

Это где?

Я тут был. Там дают ссылку на архив
https://storage.googleapis.com/downloads.webmproject.org/releases/webp/index.html
Но там нет версии x86. А у меня проект 32-битный. x86 есть в проекте из первого поста, но я не пробовал её подключать. То есть, если подойдёт, можно просто её себе в коммит утянуть? :thinking:

В свойствах файла в списке файлов проекта.

Чёт я не пойму этих библиотекарей :thinking: В библиотеке Imazen.WebP есть статический метод LoadByPath(). То есть, автор предполагает делать что-то типа этого:

    public class WebPImage
    {
        private static bool IsLibraryLoaded = false;

        public WebPImage()
        {
            if (!IsLibraryLoaded)
            {
                try
                {
                    string dllFileName = Environment.Is64BitProcess ? "libwebp_x64.dll" : "libwebp_x86.dll";
                    string dllFilePath = $"{Path.GetDirectoryName(Application.ExecutablePath)}\\{dllFileName}";
                    Imazen.WebP.Extern.LoadLibrary.LoadByPath(dllFilePath, true);
                    IsLibraryLoaded = true;
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                    IsLibraryLoaded = false;
                }
            }
        }

Но при загрузке (декодировании) картинки, он ищет файл libwebp.dll :confusedparrot:

        public Bitmap LoadFromFile(string filePath)
        {
            if (!IsLibraryLoaded || string.IsNullOrEmpty(filePath) || string.IsNullOrWhiteSpace(filePath))
            {
                return null;
            }

            try
            {
                byte[] bytes = File.ReadAllBytes(filePath);
                SimpleDecoder decoder = new SimpleDecoder();
                return decoder.DecodeFromBytes(bytes, bytes.LongLength); //вот тут
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
                return null;
            }
        }

Зачем тогда нужен метод LoadByPath() и как различать x86 / x64 / Debug / Release режимы сборки? Нужны же разные DLLки.
И примера использования у них на гитхабе нет. И официального сайта, вроде, тоже нет. Как я должен догадаться, как правильно использовать их библиотеку / обёртку? :thinking:

Можно что-нибудь придумать при желании (копировать нужную длл в Build Events, …), но зачем их различать? Вряд ли много кому нужна дебажить libwebp.

Так вроде атрибут DllImport не будет снова грузить длл если она уже в памяти.

c# - How can I specify a [DllImport] path at runtime? - Stack Overflow

А разве не важно, что она не будет соответствовать Debug или Release (если её саму не дебажить)?

Не понял :thinking: Я же в конструкторе загружаю нужную DLLку, а при декодировании файла он всё-равно пытается загрузить её ещё раз.
Если использовать DllImport, тогда ведь нельзя будет различить x86 / x64? :thinking: Для этого, видимо, и нужен метод LoadByPath() :man_shrugging:

Так а где именно пытается?

Функция декодирования импортирована так

и по идее она не будет снова искать файл длл если уже загружено.

Тогда бы не работали длл от винды в дебаг версии приложения.

byte[] bytes = File.ReadAllBytes(filePath);
SimpleDecoder decoder = new SimpleDecoder();
return decoder.DecodeFromBytes(bytes, bytes.LongLength); //вот тут

То есть, все импорты уже заранее прописаны, а класс LoadLibrary вообще ничего не делает? :thinking:

Не, наоборот, атрибут импорта не должен снова искать если уже был LoadLibrary.

Чёт не похоже :thinking: У меня наоборот получается :confusedparrot:

Так может просто не загрузилось? Что в IsLibraryLoaded, в отладочном выводе ничего нет?

неа

true