DinkToPdf Net Core не может загружать файлы DLL

Я пытаюсь создать PDF-файл из базы данных сервера html sql, используя библиотеку DinkToPdf.

В файле запуска я добавил

var context = new CustomAssemblyLoadContext();
context.LoadUnmanagedLibrary(Path.Combine(Directory.GetCurrentDirectory(), "libwkhtmltox.dll"));

Строка выдает ошибку при запуске веб-приложения

DllNotFoundException: невозможно загрузить DLL 'C: \ Program Files \ IIS Express \ libwkhtmltox.dll' или одну из ее зависимостей: указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)

System.Runtime.Loader.AssemblyLoadContext.InternalLoadUnmanagedDllFromPath (строка unmanagedDllPath)

DllNotFoundException: невозможно загрузить DLL 'C: \ Program Files \ IIS Express \ libwkhtmltox.dll' или одну из ее зависимостей: указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)

Пожалуйста, помогите, где сможете


person Joseph Wambura    schedule 30.03.2019    source источник
comment
Это нормально, если вы импортируете dinktopdf с помощью nuget? помимо загрузки напрямую как unamange?   -  person keysl    schedule 30.03.2019
comment
Здравствуйте, импортировал. Я установил его хорошо. В описании использования я должен импортировать файлы dll из пробега. Но этот метод Directory.GetCurrentDirectory (), похоже, не работает на Asp.Net Core 3.0.   -  person Joseph Wambura    schedule 30.03.2019
comment
Я думаю, что здесь виноват Asp.Net Core Directory.GetCurrentDirectory (). Он возвращает C: \ Program Files \ IIS Express \ в качестве папки по умолчанию для проекта.   -  person Joseph Wambura    schedule 30.03.2019
comment
Фарзане Талеби опубликовал ответ, в котором говорится У меня была такая же проблема, и мне помог этот учебник: medium.com/volosoft/   -  person Scratte    schedule 18.01.2021


Ответы (4)


На всякий случай, если у кого-то есть такая же проблема, я смог решить ее, установив распространяемый компонент Microsoft Visual C ++ 2015.

person CAMILO OSPINA MOLANO    schedule 20.06.2019
comment
У меня была аналогичная проблема при загрузке устаревшей 32-битной dll в среде UAT. Распространяемый компонент C ++ 2010 работал именно с этой dll. - person nf313743; 11.09.2020

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

Скопируйте родную библиотеку в корневую папку вашего проекта. Оттуда .NET Core загружает собственную библиотеку, когда собственный метод вызывается с помощью P / Invoke. Последнюю версию собственной библиотеки можно найти здесь. Выберите подходящую библиотеку для вашей ОС и платформы (64 или 32 бит).

Что ломало, так это то, что я переходил по этому URL-адресу, щелкал правой кнопкой мыши по каждому файлу и выбирал save link as (хром). Это приводит к загрузке битого файла:  введите описание изображения здесь

НЕ ДЕЛАЙТЕ ЭТОГО, вам нужно открывать каждый файл в github, а затем использовать эту кнопку Download. Здоровый файл намного больше, чем то, что вы получили бы, если пойдете неверным путем!

введите описание изображения здесь

смешно, но проблема может быть в этом ...

person Shahryar Saljoughi    schedule 29.02.2020

Я нашел некоторые обходные пути. Они не идеальны, но их стоит попробовать, и они действительно помогли, и я смог сгенерировать PDF-файлы из SQl Server. Я поместил файлы .dll в следующую папку, и это сработало.

C: \ Program Files \ IIS Express

и загруженные файлы .dll с

Path.Combine(Directory.GetCurrentDirectory(), "libwkhtmltox.dll");

Другим путем я прошел весь Путь

context.LoadUnmanagedLibrary(Path.GetFullPath(@"C:\Users\User\source\repos\WebSolution\WebApp\libwkhtmltox.dll"));

Оба они работали. Однако я призываю разработчиков Net Core очень хорошо поработать над GetCurrentDir. Или метод загрузки из папки проекта или решения

Path.Combine(Directory.GetCurrentDirectory(), "libwkhtmltox.dll");
person Joseph Wambura    schedule 30.03.2019
comment
Он работает локально, однако, когда я публикую на лазурном сервере, произошла ошибка. - person swaroop joseph; 10.06.2019
comment
Что из Mac. ? - person Idris Stack; 18.07.2019

В приложении Asp.Net Core я использую его так, чтобы получить текущий каталог во время выполнения

#if DEBUG
            //windows
            string filePath = $@"{Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}\libwkhtmltox.dll";
#else
            //linux
            string filePath = @$"{(($@"{Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)}/libwkhtmltox.so").Replace(@"\", @"/"))}";
#endif
            CustomAssemblyLoadContext context = new CustomAssemblyLoadContext();
            context.LoadUnmanagedLibrary(filePath);
            serviceCollection.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));
#endregion
person Wasyster    schedule 10.04.2020
comment
Я бы рекомендовал вместо этого использовать System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform (), проверьте платформу, если это Windows или Linux, и установите соответствующий путь. Таким образом, отладка не будет привязана к Linux. - person M.Boukhlouf; 26.08.2020