2

好的,我有从官网下载的HDF5库,还有几个DLL,包括hdf5dll.dll和hdf5_hldll.dll。

我有一些我认为是本地调用的包装器,在我的类H5、、、和。来自 H5.cs 的示例:H5LTH5FH5T

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 的场景。

4

3 回答 3

7

当您尝试从 x64 进程内对用于 x86 架构的 dll 运行 P/Invoke 操作时,就会发生这种情况,反之亦然。我会检查所有这些,如果它们不同步,请考虑将 HDF5 以您的应用程序为目标的处理器作为目标,或者检查特定于处理器的版本是否可用。

于 2010-08-12T20:55:28.413 回答
1

从这里查看文档,函数原型是:

herr_t H5open(无效);

并且不允许使用 DLLNAME,您必须明确指定 dll 名称 - 不问任何问题。

正确的签名是:

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

确保您herr_t定义了类型...

让运行时为您处理编组......

还要确保 DLL 与生成已编译的 .EXE(您的代码)的路径相同。

编辑:感谢 OP 指出我的错误......

于 2010-08-12T20:59:38.747 回答
0

在 x64 操作系统上,.net 程序通常以 x64 模式运行。只需将您的目标处理器架构设置为 x86 并重试。只需在 Visual Studio 中打开您的“解决方案配置”-管理器并添加一个新的目标平台。

于 2010-08-14T09:17:34.133 回答