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

А в Program.cs я использую H5.H5open();, но получаю BadImageFormatException. Нужна ли мне другая DLL? Подпись метода выглядит неправильно?

В качестве следующего шага я хотел бы получить это на C #: http://www.hdfgroup.org/HDF5/Tutor/h5lite.html.

ОС: 64-разрядная версия Windows 7
Среда: Visual Studio 2008 Professional

Обновление: я не знаю, будет ли это связано, и я не помню, является ли моя среда VS2008 SP1, но в этом вопросе может содержаться ключ к разгадке тайны. На данный момент я пытаюсь повторить сценарий на 32-битном VS 2010 дома.


person maxwellb    schedule 12.08.2010    source источник
comment
Это сейчас на 64-битной архитектуре, просто прочтите комментарий Стива ниже? Приложите сюда более подробную информацию, поскольку мы предполагаем ....   -  person t0mm13b    schedule 13.08.2010
comment
Спасибо. Я использую Windows x64, но я компилирую свое приложение .NET для x86. Это все еще нормально?   -  person maxwellb    schedule 13.08.2010
comment
Обратитесь к HDF и убедитесь, что предоставленные вами библиотеки DLL также созданы для архитектуры x86.   -  person Steve Danner    schedule 13.08.2010
comment
Я использовал x86 DLL, но попробую еще раз с 64-битными DLL.   -  person maxwellb    schedule 13.08.2010
comment
Вау, переход на 64-битные библиотеки DLL просто приводил к сбою vshost без исключения исключения.   -  person maxwellb    schedule 13.08.2010


Ответы (3)


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

person Steve Danner    schedule 12.08.2010
comment
Спасибо, но я пробовал эти комбинации. Я собираюсь посмотреть, решит ли проблему VS2008 SP1. - person maxwellb; 16.08.2010
comment
Хорошо, что произошло: у меня уже была нацеленная конфигурация решения x86. Но когда я создавал новые проекты, они все еще нацеливались на любой процессор. Мне пришлось удалить целевую платформу x86 и снова добавить ее, чтобы она обновляла отдельные проекты. - person maxwellb; 16.08.2010

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

herr_t H5open(void);

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

Правильная подпись:

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

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

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

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

Изменить: Спасибо OP за указание на мою ошибку ....

person t0mm13b    schedule 12.08.2010
comment
Спасибо, Томми. Итак, я не могу установить константную строку для своего имени DLL? - person maxwellb; 13.08.2010
comment
Вы увидите, что я уже включил этот бит из документации, и обратите внимание, что H5open(void) недействителен для C #. - person maxwellb; 13.08.2010

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

person Zotta    schedule 14.08.2010