【问题标题】:BadImageFormatException: PInvoke ImportDll with hdf5dll.dllBadImageFormatException:使用 hdf5dll.dll 调用 ImportDll
【发布时间】:2011-03-29 04:00:30
【问题描述】:

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

在我的课程H5H5LTH5FH5T 中,我有一些我认为是本地调用的包装器。来自 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

更新:不知道会不会有关系,也不记得我的环境是不是VS2008SP1,不过this question可能会持有解开谜团的关键。我现在正在尝试在家中在 32 位 VS 2010 上重复该场景。

【问题讨论】:

  • 这是在 64 位架构上,现在只需阅读下面史蒂夫的评论吗?请附上我们在这里猜测的更多细节......
  • 谢谢。我在 Windows x64 上,但我正在编译我的 .NET 应用程序以定位“x86”。这还可以吗?
  • 检查 HDF 并确保他们为您提供的 dll 也是为 x86 架构构建的。
  • 我一直在使用 x86 DLL,但我会再试一次,使用 64 位 DLL。
  • 哇,迁移到 64 位 DLL 似乎会使 vshost 崩溃而没有捕获异常。

标签: c# pinvoke hdf5


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    从这里看documentation,函数原型是:

    herr_t H5open(无效);

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

    正确的签名是:

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

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

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

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

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

    【讨论】:

    • 谢谢,汤米。所以,我不能为我的 DLL 名称设置一个 const 字符串?
    • 您会看到我已经从文档中包含了该位,请注意 H5open(void) 不是有效的 C#。
    【解决方案3】:

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

    【讨论】:

    • 谢谢,但我已经尝试过这些组合。我去看看VS2008 SP1能不能解决问题。
    • 好的,发生的事情是:我已经有一个针对 x86 的解决方案配置。但是,当我创建新项目时,他们仍然以“任何 CPU”为目标。我必须删除 x86 目标平台,然后重新添加它,以便更新各个项目。
    猜你喜欢
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2013-02-08
    • 2012-06-19
    • 2012-08-10
    相关资源
    最近更新 更多