1

レガシ サード パーティ コンポーネントの P/Invoke 宣言のみを含む別のヘルパー アセンブリを使用する場合、アセンブリを CLS 準拠としてマークする必要がある場合、次の 2 つの方法のどちらが優れているか疑問に思います。

  • アンマネージ宣言が を持つパブリックP/Invoke 宣言で使用Int32します。unsigned int
  • アンマネージ宣言が を持つ内部P/Invoke 宣言で使用UInt32し、内部メソッドを呼び出すときに を受け取って変換するパブリックメソッドでラップします。unsigned intInt32UInt32

これらの長所と短所は何ですか?

4

2 に答える 2

1

P/Invoke マーシャラーは、uint が大きくなりすぎても文句を言うつもりはありません。負の int になるだけです。追加のレイヤーでは、checkedキーワードを使用して OverflowException を生成できます。これはかなり望ましいことです。

手間をかける価値があるかどうかは、二次的な問題です。Win32 などの多くの API は、署名なしを論理制約として使用します。文字列の長さやメモリ ブロックのサイズと同様に、負になることはありません。実際には、このような数がオーバーフローすることはありません。それほど多くのメモリを割り当てることができないためです。uint を使用する必要があるのがスラムダンクだった API で一度実行したことを思い出せません。そのため、int を使用した単純な pinvoke 宣言を使用するだけで問題ないと思います。

于 2010-09-21T10:51:00.063 に答える
1

オプション 1 を使用した場合、正しい動作が得られるとは思いません。Int32 は 2,147,483,647 までしか上げることができません。一方、unsigned int は 4,294,967,295 まで上がります。20 億を超える値が必要ないことを知っている限り、それは実際には問題ではありません。ただし、技術的には、パブリック インターフェイスはより大きな型を公開し、境界チェックを実行して unsigned int に適合することを確認し、適合しない場合は例外をスローする必要があります。Int64 で十分です (9,223,372,036,854,775,807)。

于 2010-09-21T08:50:12.997 に答える