32-битный dllimport, генерирующий ошибку неправильного формата (0x8007000b) на платформе win7 x64 - PullRequest
1 голос
/ 19 августа 2010

Я пытаюсь установить и запустить 32-разрядное приложение на компьютере с Win7 x64.Приложение построено как приложение Win32.Он отлично работает на 32-битных платформах.На компьютере x64 он корректно устанавливается в каталог Programs (x86) и работает нормально, пока я не вызову 32-битную DLL.В то время я получаю неправильную ошибку формата (0x8007000b), указывающую, что он пытается загрузить dll неправильной битности.Действительно, он пытается загрузить 64-битную DLL из каталога System32, а не 32-битную версию в каталоге SystemWOW64.

Другое 32-битное приложение, предоставленное поставщиком dll, работает правильно и загружает 32-битную dll из каталога SystemWOW64.У меня нет источника для их приложения, чтобы увидеть, как они обращаются к DLL.

Я использую функцию DllImport, как показано ниже, для доступа к DLL.Есть ли способ декорировать вызовы DllImport, чтобы заставить его загрузить 32-битную версию?

Любые мысли приветствуются.

Спасибо, ДП

public static class Micronas
{
    [DllImport(@"UAC2.DLL")]
    public static extern short UacBuildDeviceList(uint uFlags);
    [DllImport(@"UAC2.DLL")]
    public static extern short UacGetNumberOfDevices();
    [DllImport(@"UAC2.DLL")]
    public static extern uint UacGetFirstDevice();
    [DllImport(@"UAC2.DLL")]
    public static extern uint UacGetNextDevice(uint handle);
    [DllImport(@"UAC2.DLL")]
    public static extern uint UacSetXDFP(uint handle, short adr, uint data);
    [DllImport(@"UAC2.DLL")]
    public unsafe static extern uint UacGetXDFP(uint handle, short adr, IntPtr data);
}

Ответы [ 3 ]

5 голосов
/ 20 августа 2010

Принудительно запустить ваш .exe в 32-битном режиме.Project + Properties, вкладка Build, Platform Target = x86.

Избегайте путаницы с настройкой Platform проекта, она фактически не должна соответствовать реальной настройке.Что такое Project + Properties, вкладка Build, Platform Target.Там немного беспорядка.

0 голосов
/ 24 августа 2010

Чтобы принудительно запустить приложение в 32-разрядном режиме на 64-разрядной платформе, вы можете установить его в пуле приложений IIS: в расширенных настройках установите «Включить 32-разрядные приложения» в значение ИСТИНА.

0 голосов
/ 19 августа 2010

Поскольку ваш пост помечен C #, я предполагаю, что это приложение .NET. Вероятно, он не установлен только 32-битным. Вы можете проверить это, запустив на нем файл corflags.exe и установив для него только 32-битный флаг с corflags /32bit+ myapp.exe. Если это исправит это, вам нужно исправить ваше решение / проект для сборки под x86 вместо Any CPU.

...