Badimageformatexception: pinvoke importdll с hdf5dll.dll
Вопрос
Хорошо, у меня есть библиотека HDF5 с официального сайта, и у меня есть несколько DLL, включая HDF5DLL.dll и HDF5_HLDLL.DLL.
У меня есть то, что я думаю, чтобы быть некоторые обертки вокруг родных звонков, в моих классах H5
, H5LT
, H5F
, а также H5T
. Отказ Пример от H5.cs:
namespace HDF5
{
using hid_t = System.Int32;
using herr_t = System.Int32;
using hsize_t = System.UInt64;
using size_t = System.UInt32;
// hbool_t is 0:false, +:true
using hbool_t = System.UInt32;
// htri_t is 0:false, +:true, -:failure
using htri_t = System.Int32;
public class H5
{
const CharSet StringMarshallingType = CharSet.Ansi;
const string DLLNAME = "hdf5dll.dll";
///* Functions in H5.c */
//H5_DLL herr_t H5open(void);
[DllImport(DLLNAME,
CharSet = StringMarshallingType)]
public static extern herr_t H5open();
И в программе.cs, я использую H5.H5open();
, но я получаю BadImageFormatException
. Отказ Мне нужна другая dll? Подпись метода выглядит неправильно?
Я хотел бы, как следующий шаг, получите это в C #: http://www.hdfgroup.org/hdf5/tutor/h5lite.html. .
ОПЕРАЦИОННЫЕ СИСТЕМЫ: Windows 7 64 бит
Окружающая обстановка: Visual Studio 2008 Professional
Обновлять: Я не знаю, будет ли это связано, и я не помню, если моя среда VS2008 SP1., но этот вопрос может держать ключ для решения тайны. Я на сегодняшний день пытаюсь повторить сценарий на 32 бит VS 2010 дома.
Решение
Это происходит, когда вы пытаетесь запустить операции P / вызывать DLL, предназначенные для архитектуры x86 из процесса или наоборот X64 или наоборот. Я бы проверил все это, и если они вне синхронизации, рассмотрите возможность нацеливания на процессор, что целевые цели HDF5 с вашим приложением или проверки, доступна ли версия для конкретной процессоры.
Другие советы
Глядя на то документация Отсюда, функциональный прототип:
herr_t h5open (пустота);
А также DLLName запрещено, вы должны явно указать имя DLL - никаких заданных вопросов.
Правильная подпись:
DLLIMPORT («HDF5DLL.DLL»)] публичный статический внешний HERR_T H5OPEN ();
Убедитесь, что у вас есть тип herr_t
определенный...
Пусть время выполнения позаботится о маршалке для вас ....
Также убедитесь, что DLL присутствует на том же пути, что и сгенерировано скомпилированное .exe (ваш код).
Редактировать: Благодаря ОП за указываю на мой блупер ....
На X64 Operationsystems .NET Программы обычно работают в режиме X64. Просто установите целевую архитектуру процессора на X86 и попробуйте снова. Просто в Visual Studio откройте свой «Конфигурация решения» -Manager и добавьте новую целевую платформу.