Ошибка LoadLibrary под Vista x64 - PullRequest
4 голосов
/ 12 июля 2009

Сразу после перехода с XP на Vista я понял, что мои программы на C # не работают.

Это ситуация: я написал C ++ dll, который я использую в своем приложении C #. DLL работала нормально в XP, но когда я перешел на Vista, она больше не работает в C #.

Я тестировал его в Delphi, отлично работает, но C # - нет.

Я написал дополнительный код, чтобы упростить проверку в C #.

        if (LoadLibrary("blowfish.dll") == 0)
        {
            Misc.LogToFile("error", true);
            Application.Exit();
        }

Ему не нужна среда выполнения C ++, потому что он скомпилирован с библиотеками и работает в Delphi на Vista, но не на C #.

Где может быть проблема?

Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 12 июля 2009

На платформе x64 JIT скомпилирует вашу программу в x64, так как ваш родной C ++ скомпилирован в x86, он не сможет загрузить его.
Вам нужно явно указать JIT для компиляции вашей программы в x86, вы можете сделать это с помощью CorFlags или в настройках проекта установить тип процессора x86 (в соответствии с назначением Build / Platform)

2 голосов
/ 13 июля 2009

У Shay есть быстрое решение - сделайте все приложение 32-битным, чтобы оно работало под WOW64.

Однако, «лучшее» решение - перестроить dll C ++ как 64-битный код, чтобы вся ваша программа могла работать на 64-битной ОС.

1 голос
/ 13 июля 2009

Если вы компилируете нормально, CLR запустит ваше приложение как 64-битное в x64 Windows и 32-битное в x86 Windows. Вы должны загрузить правильное исходное изображение для платформы. Одно из решений - сделать так, как предложил Шей, и заставить ваше приложение работать в 32-битном CLR.

Вы также можете заставить свое приложение смотреть на собственный размер указателя и загружать правильное собственное изображение.

string blowfishdll = "blowfish.dll";
// detect 64-bit installations by looking at the native pointer size
if( 64 == IntPtr.Size * 8  )
    blowfishdll = "blowfish-x64.dll"

if (LoadLibrary( blowfishdll ) == 0)        
{
    Misc.LogToFile("error", true);            
    Application.Exit();        
}
...