Как добавить файл DLL в проект UWP

Я создаю средство просмотра UWP для библиотеки Pdfium (pdfium.dll). pdfium.dll - это библиотека классов C ++. В моем решении Visual Studio у меня есть два проекта UWP. Первый проект (PdfiumViewer) - это библиотека классов UWP, которая импортирует функции из pdfium.dll и создает пользовательские элементы управления. Например:

[DllImport("pdfium.dll")]
public static extern void FPDF_AddRef();

Второй проект (PdfiumViewer.Demo) - это пустое приложение UWP, и я сослался на первый проект здесь, чтобы я мог использовать его пользовательские элементы управления в этом проекте. Я включил pdfium.dll в папку bin моего второго проекта. Но когда я запускаю программу, я получаю исключение: «Невозможно загрузить pdfium.dll».

Существуют аналогичные средства просмотра, разработанные для приложений .Net Windows Forms и WPF.

Я попытался добавить pdfium.dll в качестве ссылки, щелкнув правой кнопкой мыши ссылку -> «Добавить ссылку». Во всех этих случаях (.Net WinForm, .Net WPF, UWP) его добавление дало мне ошибку. (ОШИБКА: не удалось добавить ссылку на .... \ pdfium.dll. Убедитесь, что файл доступен и является допустимой сборкой или компонентом COM)

Я добавил pdfium.dll в .Net WinForm и .Net WPF аналогичным образом (в папку bin) и запустил их. Оба типа программ просмотра приложений работали нормально.

Мой вопрос: Поскольку приложения UWP работают в изолированной программной среде, есть ли специальное место для добавления этой dll (pdfium.dll)?

Примечание: я пытался добавить файл в разные места. (внутри папки APPX, внутри папки bin \ Debug, внутри bin \ Debug \ x64 и т. д.)


person Gayashan Rathnavibushana    schedule 19.12.2019    source источник
comment
это может быть полезно docs.microsoft.com/en-us/cpp/porting/   -  person Chanaka Anuradh Caldera    schedule 22.12.2019
comment
Я обнаружил, что pdfium.dll должен находиться в папке APPX / x64. Тем не менее, я получаю исключение, в котором говорится, что System.DllNotFoundException: невозможно загрузить pdfium.dll или одну из его зависимостей. Указанный модуль не может быть найден.   -  person Gayashan Rathnavibushana    schedule 31.12.2019
comment
Скопируйте свою dll в папку проекта и установите тип как содержимое.   -  person Nico Zhu - MSFT    schedule 03.01.2020
comment
Я отлаживаю код с помощью точек останова и обнаружил, что LoadLibrary (path) вернула IntPtr.Zero. File.Exists (путь) вернул истину. Кто-нибудь знаком с библиотекой pdfium? Можно ли использовать эту DLL в среде UWP?   -  person Gayashan Rathnavibushana    schedule 07.01.2020


Ответы (2)


При добавлении dll в проект VS UWP выполните следующие действия.

Во-первых, проверьте dll с помощью средства проверки зависимостей и выясните, нужны ли dll дополнительные зависимости (например, любые другие dll).

Тогда (1). Щелкните проект правой кнопкой мыши -> «Добавить» -> «Добавить существующий элемент» -> выберите dll -> выберите кнопку «Добавить как ссылку» на стрелке в кнопке «Добавить». (2). После добавления dll измените свойства на «Содержимое» и «Копировать, если новее».

person Gayashan Rathnavibushana    schedule 25.02.2020

Как добавить файл DLL в проект UWP

Исходя из этого случая, вам нужно скопировать свою dll в папку проекта и установить тип как content . Затем в соответствующем файле cs, используя DllImport для вызова dll.

person Nico Zhu - MSFT    schedule 19.12.2019
comment
Невозможно добавить dll в проект через ссылки, поэтому нельзя установить тип как content. Даже если добавить как существующий элемент и установить как content, LoadLibrary (путь) или LoadPackagedLibrary (путь) вернут IntPtr.Zero. - person Gayashan Rathnavibushana; 20.01.2020
comment
Изменить для приведенного выше комментария Невозможно добавить dll в проект через ссылки (не разрешено из VS), поэтому нельзя установить тип как контент. Даже если добавить как существующий элемент и установить как content, LoadLibrary (путь) или LoadPackagedLibrary (путь) вернут IntPtr.Zero. Попробуйте обернуть компонент UWP WinRT, но, как я понял, исходный код необходим как проект VS (по крайней мере, как библиотека классов .Net). Исходный код Pdfium использует систему сборки GN и ninja, и проект не является VS Project. Есть предложения? Или нужны дополнительные пояснения? - person Gayashan Rathnavibushana; 20.01.2020
comment
Вы можете перетащить файл DLL, а затем перетащить его в проект. Не могу этого сделать? - person Nico Zhu - MSFT; 20.01.2020
comment
Я тоже так добавил. Произошло то же самое. LoadLibrary (путь) или LoadPackagedLibrary (путь) возвращают IntPtr.Zero. - person Gayashan Rathnavibushana; 22.01.2020