12

の最適化されたバージョンを作成できるかどうかを知りたいと思っていました (現在、私のアプリケーションの 1 つのボトルネックであるためStringBuilder、少し高速化することに挑戦するため)。残念ながら、私が使用できない「魔法の」システムコールを使用しているようです(またはそう思われます)。

のソース コードを逆コンパイルした後System.Text.StringBuilder、次の内部(したがって呼び出し不可能な) システム コールを使用していることに気付きました。

[SecurityCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
internal static string FastAllocateString(int length);

文書化されていない、よく使用される属性もあります。

[ForceTokenStabilization]

すべての呼び出しをFastAllocateString(n)justに置き換え、すべての属性String.Emptyをコメントアウトすることができました。[ForceTokenStabilization]これを実行し、他のクラスからいくつかのメソッドをコピーして貼り付けた後、実際にコンパイルすることができました。(完全なコード)。

これら 2 つのトレードオフには理由があると思います。

  • 秘密の忍者の別の呼び方を知っている人はいますFastAllocateStringか?
  • 誰がForceTokenStabilization実際に何をしているのか知っていますか (そして、おそらくそれを達成するための別の方法はありますか?)
4

1 に答える 1

12

あなたはそれを呼び出すことができます:

var fastAllocate =
            typeof (string).GetMethods(BindingFlags.NonPublic | BindingFlags.Static)
                .First(x => x.Name == "FastAllocateString");

var newString = (string)fastAllocate.Invoke(null, new object[] {20});

Console.WriteLine(newString.Length); // 20

FastAllocateStringのメンバーであることに注意してくださいstring

Rotor SSCLI ディストリビューションは、コードが実行されているプラ​​ットフォームのネイティブ ASM を内部的に発行して、バッファーを割り当て、アドレスを返します。公式の CLR がほぼ同じことをしているとしか思えません。

このリンクによると、ForceTokenStabilization次の目的で使用されます。

//===========================================================================================================
// [ForceTokenStabilization] - Using this CA forces ILCA.EXE to stabilize the attached type, method or field.
// We use this to identify private helper methods invoked by IL stubs.
//
// NOTE: Attaching this to a type is NOT equivalent to attaching it to all of its methods!
//===========================================================================================================
于 2013-11-15T02:23:29.447 に答える