3

バックグラウンド

私はマネージ x64 アセンブラ (ライブラリでもあります) を作成しているため、アドレスおよびオフセットとして使用する符号なし 64 ビット整数プロパティを定義する複数のクラスがあります。いくつかはファイル オフセットで、他は絶対アドレス (メイン メモリに相対的) で、その他は相対仮想アドレスです。

問題

ulong上記のシナリオでは、プロパティにデータ型を使用していますが、これは正常に機能します。ただし、そのようなプロパティは CLS に準拠していません。それらを としてマークすることはでき[ClsCompliant(false)]ますが、ライブラリのユーザーに CLS 準拠の代替手段を提供する必要があります。

オプションと質問

より大きなデータ型の代替プロパティを提供することを提案する人もいますが、 から0までのすべての値を保持できるより大きな符号付き整数プリミティブがないため、これはオプションではありませんUInt64.MaxValue

ほとんどの使用シナリオでは、すべての可能な値が使用されるわけではないため、アセンブリ全体を非 CLS 準拠としてマークしたくありませんUInt64.MaxValue。したがって、たとえば、正の値のみを受け入れるAddress代替longプロパティを提供できます。ただし、何らかの理由で を超える値が含まれているAddressAlternative場合はどうなるでしょうか。いくつかの例外をスローする必要がありますか?AddressInt64.MaxValueAddressAlternative

そして、にふさわしい名前は何でしょうAddressAlternative?

を使用するたびに代替手段を提供するulongと、多くの「二重」プロパティが発生します。これを行うより良い方法はありますか?ulongプロパティのすべての使用法が同じセマンティクスを持つわけではないことに注意してくださいstruct

そして最後に、コンストラクターのパラメーターに同じ CLS 準拠の問題があります。longでは、そのようなパラメーターを受け入れる代替のオーバーロードを提供する必要がありますか?

ほとんどのシナリオで使用できる限り、CLS のみのコンテキストからライブラリを使用する場合、ライブラリの (一部の機能) の使用を制限してもかまいません。

4

2 に答える 2

2

ただし、Int64.MaxValueより上の符号なしアドレスを表す場合

間違ったタイプを使用しています。アドレスはIntPtrまたはUIntPtrに保存する必要があります。あなたの問題が現実的である方法はありません。UInt64で1ビットを失う余裕がない場合は、オーバーフローに近すぎますこの数値がインデックスを表す場合、プレーンなInt32で問題ありません。64ビットマシンでも、.NETメモリブロブは2ギガバイトに制限されています。

それがアドレスである場合、IntPtrは非常に長い間問題ありません。現在利用可能なハードウェアは、その制限に達することから4.5桁離れています。近づくには非常に抜本的なハードウェアの再設計が必要になります。その日が来ると、はるかに大きな問題が発生する可能性があります。私が引退するまでは、9エクサバイトの仮想メモリで十分です。

于 2011-04-05T17:53:52.613 に答える
0

Microsoft は 64 ビット アドレスを UInt64 ではなく Int64 として定義しているため、CLS に準拠することができます。

http://msdn.microsoft.com/en-us/library/837ksy6h.aspxを参照してください。

基本的に言う:

IntPtr コンストラクター (Int64)

指定した 64 ビット ポインターを使用して、IntPtr の新しいインスタンスを初期化します。

パラメーター値 型: System.Int64 64 ビットの符号付き整数に含まれるポインターまたはハンドル。

はい、簡単なテストを行ったところ、x64 または任意の CPU を対象としたプロジェクトで次のものが正常に機能しました。コードにブレークポイントを配置して調べxました。ただし、x86 のみをターゲットにすると、例外がスローされます。

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            IntPtr x = new IntPtr(long.MaxValue);
        }
    }
}

しかし、本当にその余分なビットが必要であることが判明した場合. 2 つのライブラリを提供できます。1 つは CLS 準拠であり、1 つはそうではありません -- ユーザーの選択。これは、#if ステートメントと条件付きコンパイル シンボルを使用することで実現できます。このようにして、同じ変数名を異なる定義で定義できます。http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx

于 2011-04-16T14:02:19.857 に答える