32-битов dllimport генерира грешка при неправилен формат (0x8007000b) на платформа win7 x64

Опитвам се да инсталирам и стартирам 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-битовата версия?

Всякакви мисли се оценяват.

Благодаря, DP

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);
}

person DFP    schedule 19.08.2010    source източник
comment
Направих повече тестове и имам още по-странни резултати... Както коментирах по-долу. DLL всъщност извиква функциите на DllImport по-горе. Успях да създам програма, която използва правилно тези функции, т.е. те бяха наречени 32-битови. Създадох нова програма, която зарежда DLL, който извършва повикването, и тя също работи правилно. Програмата, която се проваля, има същите настройки на проекта (x86), но Windows иска да зареди 64-битовата версия. Опитах и ​​корфлаговете /32bit++ без резултат. Много съм потресен....   -  person DFP    schedule 20.08.2010


Отговори (3)


Принудете вашия .exe да работи в 32-битов режим. Проект + Свойства, раздел Изграждане, Целева платформа = x86.

Избягвайте да се обърквате от настройката на платформата на проекта, тя всъщност не трябва да съответства на реалната настройка. Което е Project + Properties, раздел Build, Platform Target. Малко бъркотия там.

person Hans Passant    schedule 19.08.2010
comment
Само за да стане още по-объркващо, целта на платформата зависи от избраната конфигурация. Така че посочвате x86 за компилации за отстраняване на грешки (без да сте наясно, че е само за компилации за отстраняване на грешки) и всичко работи добре, докато проектът не бъде пуснат през окончателното издание на компилацията с MSBuild и след много разкъсване на косата откривате, че за конфигурация = Освободете целта на платформата все още е всеки процесор. Арх! - person RenniePet; 17.09.2013

Тъй като публикацията ви е маркирана с C#, предполагам, че това е .NET приложение. Вероятно не е зададен само 32-битов. Можете да проверите, като стартирате corflags.exe върху него и зададете флага само за 32-бита върху него с corflags /32bit+ myapp.exe. Ако това го поправи, трябва да коригирате решението/проекта си, за да се изгради като x86 вместо с произволен процесор.

person Bob    schedule 19.08.2010
comment
благодаря за предложенията. Прав сте, че това е .NET приложение и включва редица DLL файлове. DLL поддържат COM Interop, ако това има някакво значение. Кодът на DllImport по-горе е в един от DLL на проекта. Проектите бяха преустроени с x86 флага и аз също опитах corflags без резултат. Едно интересно нещо е, че създадох нов C# проект и използвах кода на DllImport по-горе без проблеми, т.е. той зареди правилно 32-битовата версия. Предполагам, че следващата ми стъпка е да опитам нов DLL, за да видя дали работи. - person DFP; 20.08.2010

За да принудите приложението да работи в 32-битов режим на 64-битова платформа, можете да го зададете в групата приложения на IIS: в разширените настройки задайте „Разрешаване на 32-битови приложения“ на TRUE.

person Petr Kozelek    schedule 24.08.2010