Невозможно загрузить DLL - PullRequest
       11

Невозможно загрузить DLL

1 голос
/ 04 декабря 2011

Я пытаюсь загрузить dll, используя DllImport, он работает нормально, если я указал путь к dll, однако, если я не указал путь к dll и просто набрал "foo.dll", он жалуется "Невозможно загрузить dll ", даже если я уже поместил файл dll в папку bin.

Я подумал, что если я не укажу путь dll, он будет предполагать, что он запустит dll в той же папке, что иexe-файл, но, похоже, дело не в этом.

Есть предложения?

Спасибо

Ответы [ 3 ]

0 голосов
/ 04 декабря 2011

Если вы не хотите использовать путь, вы всегда можете поместить dll в Windows GAC ( вики-ссылка ). Это может быть больно, так как иногда вам нужно подписать свою dll, но средства могут быть доступны без пути.

0 голосов
/ 04 декабря 2011

Скорее всего, DLL, которую вы пытаетесь загрузить, зависит от других ресурсов. Вы можете обмануть DllImport, сначала вызвав Win32 LoadLibrary на удаленном пути. DllImport заметит, что библиотека уже загружена в память, и она должна просто работать.

Фрагмент кода:

    [DllImport("kernel32.dll")]
    public static extern IntPtr LoadLibrary(string dllToLoad);

    [DllImport("yourlibrary.dll")]
    public static extern void Foo();

    public void CallTheFooMethod()
    {
       // first load the library
       LoadLibrary( "C:/..........full path/yourlibrary.dll" );

       Foo();  
    }
0 голосов
/ 04 декабря 2011

В вашем проекте C ++ dll откройте свойства проекта, перейдите к C / C ++ -> Генерация кода.Затем для библиотеки времени выполнения установите Многопоточную отладку (/ MTd) для конфигурации отладки и Многопоточную (/ MT) для выпуска.После этого вы можете поместить скомпилированную dll в вашу выходную директорию и проверить, работает ли она.Не стесняйтесь комментировать и задавать вопросы.

UPD:

Вот ссылка на простой маленький проект , который измеряет текущую частоту процессора, используянативный код, DllImport'ed для кода проекта C #.

Шаги для сборки: 1. Создайте проект C ++ в любой конфигурации (на самом деле не важно, какую конфигурацию использовать в этом примере).2. Найдите скомпилированную dll в папке вывода конфигурации (Debug | Release). 3. Добавьте найденную dll в папку ExternalLibraries в проекте C #, установите для свойства Копировать, если самое новое в свойствах файла (щелкните правой кнопкой мыши на lib -> Properties).4. Создайте и запустите проект C # -> прибыль.

Почему я предложил вам это: мой клиент запросил код, который будет измерять частоту процессора, я просто выполнил этот код на своей машине, ноклиент не сделалЭто зависело от библиотек времени выполнения MS VC.После настройки Многопоточной отладки (/ MTd) для конфигурации Debug и Многопоточной (/ MT) для версии Release все зависимости становятся встроенными в ваш двоичный файл, поэтому по крайней мере один источник зависимостей вы уже можете разрешить.

...