2

わかりました。公式サイトから HDF5 ライブラリをダウンロードしました。hdf5dll.dll や hdf5_hldll.dll などの DLL もいくつかあります。

H5クラス、H5LTH5F、およびで、ネイティブ呼び出しのラッパーと思われるものを持っています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

OS: Windows 7 64bit
環境: 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

here からドキュメントを見ると、関数プロトタイプは次のとおりです。

herr_t H5open(void);

また、DLLNAME は許可されていません。DLL 名を明示的に指定する必要があります。質問はありません。

適切な署名は次のとおりです。

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

herr_tタイプが定義されていることを確認してください...

マーシャリングはランタイムに任せてください....

また、コンパイルされた .EXE (コード) が生成される場所と同じパスに DLL が存在することも確認してください。

編集:私のNG集を指摘してくれたOPに感謝します....

于 2010-08-12T20:59:38.747 に答える
0

x64 オペレーティング システムでは、.net プログラムは通常 x64 モードで実行されます。ターゲット プロセッサ アーキテクチャを x86 に設定して、もう一度試してください。Visual Studio で "Solution Configuration"-Manager を開き、新しいターゲット プラットフォームを追加します。

于 2010-08-14T09:17:34.133 に答える