4

を使用してプロジェクトで参照しているアンマネージ DLL がありますが、[DLLImport]メソッド シグネチャを一致させると奇妙な結果が返されます。

DLL からの署名の例を次に示します。

DLLEXPORT unsigned long OpenPort(unsigned long  ulPort,
                                     unsigned long  ulBaudRate,
                                     unsigned long  ulByteSize,
                                     unsigned long  ulPartity,
                                     unsigned long  ulStopBits,
                                     unsigned long  ulFlowControl)

関数をインポートするための C# コードは次のとおりです。

[DllImport("C:/my.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint OpenPort(ulong ulPort, ulong ulBaudRate,
    ulong ulByteSize, ulong ulParity, ulong ulStopBits, ulong ulFlowControl);

これを の戻り値の型で宣言していることに注意してください。これuintを使用しようとするulongと、予期しない結果が得られるためです (通常、メモリ アドレスのように見える長い数値)。

intただし、 /の戻り値の型を使用すると、関数は機能し、期待される結果を返しますuint。誰かが私のためにこの行動に光を当てることができますか?

ありがとう。

4

1 に答える 1

3

DllImport属性のライブラリの名前に基づいて、ターゲット プラットフォームは Windows であると想定しています。Windows では、32 ビットと 64 ビットの両方で、C++long型 (明らかに符号なしと符号あり) は 4 バイト幅です。uintしたがって、ではなくp/invoke を使用して宣言する必要がありますulong

正しい宣言は次のとおりです。

[DllImport("C:/my.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint OpenPort(
    uint ulPort, 
    uint ulBaudRate,
    uint ulByteSize, 
    uint ulParity, 
    uint ulStopBits, 
    uint ulFlowControl
);

ターゲット プラットフォームが Windows 以外の場合、unsigned long具体的なアドバイスを提供するには、そのプラットフォームに何があるかを知る必要があります。

于 2013-11-04T12:13:54.123 に答える