BadImageFormatException: PInvoke ImportDll с hdf5dll.dll - PullRequest
2 голосов
/ 13 августа 2010

Хорошо, у меня есть библиотека 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();

А в Program.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 дома.

Ответы [ 3 ]

6 голосов
/ 13 августа 2010

Это происходит, когда вы пытаетесь запустить операции P / Invoke на dll, предназначенной для архитектуры x86, из процесса x64 или наоборот. Я бы проверил все это, и если они не синхронизированы, рассмотрите возможность нацеливания на процессор, на который нацеливается HDF5, с вашим приложением, или проверьте, доступна ли версия для конкретного процессора.

1 голос
/ 13 августа 2010

Глядя на документацию здесь, прототип функции:

herr_t H5open(void);

А также имя DLLNAME запрещено, вы должны явно указать имя dll - без вопросов.

Надлежащая подпись:

[DllImport("hdf5dll.dll")]public static extern herr_t H5open();

Убедитесь, что у вас определен тип herr_t ...

Пусть среда выполнения позаботится о сортировке для вас ....

Также убедитесь, что DLL находится по тому же пути, что и сгенерированный .EXE (ваш код).

Редактировать: Спасибо ОП за указание на мой блокер ....

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

В операционных системах x64 .net программы обычно работают в режиме x64.Просто установите целевую архитектуру процессора на x86 и попробуйте снова.Просто в Visual Studio откройте свой «Solution Configuration» -Manager и добавьте новую целевую платформу.

...