Member 13060802 Ответов: 1

Неуправляемый 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.

1 Ответов

Рейтинг:
1

KarstenK

Похоже, вы находитесь в "dll-аду". Твой единственный друг-старый добрый Ходок Зависимости Часто эта ошибка является синдромом того, что некоторые другие библиотеки DLL, такие как некоторые библиотеки dll времени выполнения, отсутствуют. Проверьте, что ваша библиотека dll находит все необходимые библиотеки dll. Следите за красными или розовыми библиотеками в Dependeny Walker.

Отличается ли поведение при одноступенчатой отладке?
Проверьте после установки, что dll находится там, где она должна быть на целевой машине.

Совет: свяжите свою библиотеку dll как статическую библиотеку. Вы получаете толстую, но надежную библиотеку dll


Member 13060802

Если я действительно свяжу свою библиотеку dll со статической библиотекой, смогу ли я ее сгенерировать?модуль winmd? Вот что мне понадобится.

Randor

Разве вы не должны обратиться за поддержкой в Integrated Biometrics?
Как бы то ни было... Я подозреваю, что Карстенк прав и что вам нужно установить распространяемый файл Visual C++ для любой версии Visual Studio, с которой была скомпилирована DLL. Вы можете избежать этого, используя статически связанных DLL.

https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads

Member 13060802

Не могли бы вы объяснить, как "связать dll как статическую библиотеку", пожалуйста. Кроме того, как бы я использовал его в качестве компонента среды выполнения windows?

Randor

Вы искали здесь, на codeproject?
https://www.codeproject.com/Articles/85391/Microsoft-Visual-C-Static-and-Dynamic-Libraries

Member 13060802

Я запустил dumpbin на DLL и вижу нижеприведенную DLL в dumpbin:
WINUSB.DLL
mfc90.dll
MSVCR90.dll
KERNEL32.dll
USER32.dll
GDI32.dll
VERSION.dll
MSVCP90.dll
SETUPAPI.dll

Я думаю, что хотел бы проверить каждую библиотеку dll выше отдельно, чтобы увидеть, может ли моя среда выполнения windows выбрать ее?