代码之家  ›  专栏  ›  技术社区  ›  maxwellb

BadImageFormatException:PInvoke importdell with hdf5dll.dll

  •  2
  • maxwellb  · 技术社区  · 14 年前

    在我的类中,我有一些关于本机调用的包装器 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

    下一步,我想把这个写进C#: http://www.hdfgroup.org/HDF5/Tutor/h5lite.html

    操作系统: Windows 7 64位
    环境: Visual Studio 2008专业版

    我不知道这是否相关,我也不记得我的环境是否是VS2008 SP1级 ,但是 this question 可能是解开谜团的钥匙。到目前为止,我正在尝试在国内重复32位VS2010的情况。

    3 回复  |  直到 7 年前
        1
  •  7
  •   Steve Danner    14 年前

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

        2
  •  1
  •   t0mm13b    14 年前

    在看 documentation 从这里开始,功能原型是:

    herr_t H5open(void);
    

    而且DLLNAME是不允许的,您必须显式指定dll名称-不需要任何问题。

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

    一定要有那种类型 herr_t 定义。。。

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

    感谢OP指出我的错误。。。。

        3
  •  0
  •   Zotta    14 年前

    只需将目标处理器体系结构设置为x86,然后重试。 只需在visualstudio中打开“解决方案配置”管理器并添加一个新的目标平台。