2

私は、ある日、大規模な C# アプリケーションの中に埋もれてしまい、長い間忘れられ、見過ごされてきたコードを持っています。ただし、このコードには重大な落とし穴があります。これはプラットフォームのエンディアンに依存しており、コードの性質上、単純に で囲むことはできませんif(BitConverter.IsLittleEndian)(これには、いくつかの LayoutKind.Explicit 構造体と、外部の値を受け取るオーバーラップ フィールドが含まれます。オーバーラップ フィールドは、リトル/ビッグ エンディアンのために正しく配置する必要があります。そうしないと、不正な値が読み取られるため、プログラムがゆっくりと破損します)

私が欲しいのは、ソースコードのコンパイラディレクティブで、ターゲットプラットフォームに応じて両方の構造体レイアウトを提供するか (「Any CPU」は少し問題です)、またはコードが他のプラットフォーム用にコンパイルされているかどうかを検出する可能性が高いです。次に x86 または x64 を実行し、コンパイラを発行し#errorて、コードを保守している人は誰でもそのソース ファイルに誘導され、プラットフォームの依存関係とビッグエンディアンに必要な変更を示す私のコメントを確認します。

ビルド構成にシンボルを貼り付けることはできますが、それが存在する理由を文書化したり、将来のプログラマーがシンボルを削除したり、ARM などの新しいビルド構成にやみくもにコピーしたりしないようにする良い方法はありません。ビッグ エンディアン プラットフォーム。

4

1 に答える 1

0

多分そのようなものはうまくいくでしょうか?:

interface MyStruct { ... }
struct BigEndianStruct : MyStruct { ... }
struct LittleEndianStruct : MyStruct { ... }

エンディアン固有の構造体の代わりにどこでも MyStruct を使用します。これらの構造体を作成するには、次のようになります。

public static MyStruct CreateStruct() { 
  return BitConverter.IsLittleEndian
          ? new LittleEndianStruct()
          : new BigEndianStruct();
}
于 2013-03-23T14:22:27.020 に答える