Неуправляемый DLL не был найден
Неуправляемая библиотека DLL не найдена
Что я уже пробовал:
У меня есть проект cordova, ссылающийся на компонент среды выполнения windows. Вот как я вызываю метод из JS
using System; namespace IBscanUltimate { public sealed class Class1 { public static String getSDK() { IBscanUltimate.DLL.IBSU_SdkVersion a = new DLL.IBSU_SdkVersion(); IBscanUltimate.DLL._IBSU_GetSDKVersion(ref a); return "SDKVersion: " + a; } }Это часть DLLImport, которая, похоже, не может найти конкретную библиотеку DLL:
internal partial class DLL { [DllImport("IBScanUltimate.DLL")] private static extern int IBSU_GetSDKVersion(ref IBSU_SdkVersion pVerinfo); public static int _IBSU_GetSDKVersion(ref IBSU_SdkVersion pVerinfo) { int nRc = IBSU_STATUS_OK; nRc = IBSU_GetSDKVersion(ref pVerinfo); return nRc; } }Точно ошибка:
System.DllNotFoundException: Unable to load DLL 'IBScanUltimate.DLL': The specified module could not be found. (Exception from HRESULT: 0x8007007E)Я поместил свою библиотеку DLL в свой компонент времени выполнения в виде файла содержимого и установил копию на вывод, чтобы всегда копировать.
Обновление 1: я наткнулся на https://msdn.microsoft.com/en-us/library/windows/desktop/hh447159 (v=vs.85). aspx эта статья объясняет, что
LoadPackagedLibraryфункция может быть использована для загрузки библиотеки dll. Я не вижу никакого примера того, как использовать это в C#.
Обновление 2: укажите путь поиска для DllImport в .NET упоминает, что можно использовать SetDllDirectory или Addlldirectory. У него есть фрагмент кода для SetDllDirectory, но аргумент-string[] paths. Как бы я определил относительный аргумент?
Обновление 3:
[DllImport("kernel32.dll", SetLastError = true)] static extern bool SetDllDirectory(string lpPathName); public static bool setPath(String path) { //Windows.Storage. //return SetDllDirectory("ms-appx:///"); return SetDllDirectory(path); }
Я попытался вызвать метод SetDllDirectory (path) с различными местоположениями, к которым мое приложение должно иметь доступ, но я все время получаю "false". Несколько примеров, которые я пробовал:
NativeMethods.setPath(Package.Current.InstalledLocation.Path.ToString()); StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder; StorageFolder folder = Windows.Storage.KnownFolders.MusicLibrary;
Именно здесь установлено мое приложение:
C:\Users\AAA\App\hello\platforms\windows\build\windows\Debug\x64\AppXи я вижу, что моя библиотека находится там. Но все же я получаю исключение, что DLL не может быть найдена. Должен ли я что-то добавить в манифест по этому поводу?
jekin77
проверьте свой рабочий каталог ! потому что IBScanUltimate сборки '.DLL ' должна быть помещена в рабочий реж. (обычно это ../bin / debug или ..bin/release)
Member 13060802
Да, он там, но все равно говорит, что не может его найти :(
jekin77
может быть, ваш Ибсканултим.DLL зависит от других DLL, которые не могут быть найдены ?!
проверьте настройки проекта- & gt; Параметры отладки- & gt;рабочий каталог
Member 13060802
Мне дали библиотеку DLL и несколько примеров кода, показывающих, как ее использовать. Этот примерный проект работает нормально, я пытаюсь имитировать его в своем приложении cordova, но я сталкиваюсь с этой проблемой.
RickZeeland
Убедитесь, что у вас есть правильная версия DLL, x86, x64, Debug или Release.
Вы можете использовать Dependency Walker, чтобы увидеть, есть ли в dll отсутствующие ссылки.
Удачи !
Member 13060802
Спасибо. Да, я позаботился об этом. Мой проект cordova работает в x64, и DLL также предназначена для x64.