2009-04-16 2 views
3

У меня есть приложение C# (.NET 3.5, VS2005 Professional), которое использует неуправляемую 32-битную библиотеку, написанную на C/C++. API, который я использую:неуправляемый код dll

void * Инициализировать (int x);

voic GetData (void *);

И это работает, когда я запускаю его на Windows XP 32bit, но на XP64bit Windows, он бросает исключение:

Необработанное исключение: System.Reflection.TargetInvocationException: Исключение было брошено на цели вызова. ---> System.BadImageFormatException: Была сделана попытка загрузить программу с неправильным форматом. (Исключение из HRESULT: 0x8007000B) на Aktuelizator.CommonLibrary.InitializeRingBuffer (Int32 тусклый) на Aktuelizator.AktuelizatorWService.AktuelizatorWS..ctor()

Эти неуправляемые работы DLL под 64-битной XP при вызове из 32-битных unmanages writetn приложений в C/C++.

У кого-нибудь есть идеи?

ответ

2

Платформа конфигурации сборки установлена ​​в «Любой процессор», то есть на 64-битной ОС она работает как 64 бит, и вы не можете загрузить DLL. Вместо этого установите x86, это заставит его работать как 32 бит, независимо от ОС, и ваша dll будет нормально загружаться.

+0

Это решило проблему! Спасибо! – Mita

1

Похоже, что ваша DLL только скомпилирована до 32 бит, но вы пытаетесь вызвать ее как из 32-битного, так и 64-битного процесса. Первые будут работать, конечно. Позднее, однако, не будет. 32-разрядные библиотеки DLL могут использоваться только в 32-битных процессах. Попробуйте скомпилировать DLL для 64-битной цели и позволить использовать приложение C#.

+1

Да, но это работает, когда он вызывается из 32-битного скомпилированного приложения, запущенного на XP64bit. Можно ли это сделать без перекомпиляции dll? – Mita

+0

32-разрядный исполняемый файл, работающий на 64-битной ОС, считает, что он работает в 32-битном мире - Google WOW64 для большего. Попробуйте запустить приложение из 32-битной среды, такой как C: \ Windows \ SysWOW64 \ cmd.exe, поэтому процесс будет 32-битным, как DLL. – eran

+0

BTW, мое предложение применяется в случае, если вам нужно сделать это с помощью приложения и библиотеки DLL, поэтому вам необходимо обходное решение. Если вы сможете перестроить приложение, решение Стивена Мартина решит проблему, а не обойдет ее. – eran

0

Проверьте все параметры, которые определены как Int32, что на самом деле должно быть IntPtr.

+0

Я дважды проверил его, это не помогло – Mita