2010-12-15 6 views
7

Reflectorの生成ファイルの1つにメソッドのスニペットがある別のプロジェクトの.NETアセンブリがあります。

今VS 2010 c#コンパイラは、あらゆる種類のコンパイルエラー$$ unexpectedをスローします。 ILDASMに近いかっこなど

は、私は多くの人が言及したが、生成されたコードで、私は1つだけ入ってくるこれらのコンパイラcgeneratedメソッドのを見つけると一緒に、このメソッドを参照してください。

コンパイル行くには?

答えて

4

これらは通常static readonlyアレイによって作成されます。あなたはそれらを編集しません。また、リフレクターは、些細なコード以外は何も作り直しています。

元のソースコードを入手することをお勧めします。

+0

私はこれらのうちの1つを取得しました。これは定数のリテラル配列(ints)によるものです。たとえば、 'if(new [] {16,32,42,64,314,1337} .Contains(something)){}です。 ..} '。 –

+0

非常に良いセキュリティ・ステップのように聞こえます(それを難読化するよりも優れています)。あなたが今他の方法を知っていれば、私は非常に素晴らしいだろうか? –

1

これらはコンパイラによって自動的に生成されます。ラムダ式オブジェクト(名前を指定しない)のようなものがあると思います。私は、コンパイラが自分のコードと矛盾がないことを確認したいので、それらが無効な名前だと確信しています。再コンパイルする前にそれらの名前を変更する必要があります。

+0

WAHTして名前を変更?コードはどこですか?私はオリジナルのソースを持っていません。私たちは逆アセンブルされたコードで作業しており、このスニペットはegenratedファイルに存在します。どのようにこれを取り除くか、このコンパイルを取得します。 –

+0

はい、私はあなたの逆アセンブルされたコードの中で、グローバルな検索/置換を意味します。一意的なすべての ' {GUID} .method $$ ****'に対して、あなたはそれを有効な識別子で置き換えます。 – Mehrdad

0

表示メニューからオプションを選択します。

最適化の選択を確認します。 VSの最新バージョンを使用しているため、ラムダのサポートを得るために.Net 4.0または少なくとも3.5を最適化するように指定する必要があります。

0

すべてのケースで、私はこれをArray初期化子と関係があると見てきました。作成された型を見ると、コンパイラは初期化した各サイズ配列に対して異なる構造体を作成したことに気付くでしょう。コンパイラは、ILのサイズを小さくし、配列要素のメモリ割り当てを高速化し、メモリに格納された配列要素をまとめて順番に保つためにこれを行います。雑草を深く掘り下げることなく、このようにすれば、サイズ配列の初期化は、既知の一定数のIL命令で行われることになります。私はILDasmでの私の掘り出しから思い出すことはできませんが、私はそれが4だったと思います。

問題が発生しました。名前を変更する必要があるバリュー・タイプのインスタンスを扱っているだけであることが分かったら、それほど悪くはありません。リフレクターで検索すると、コンパイラーが生成したオブジェクトが使用されているインスタンスが明らかになるはずです。元の宣言と初期化は元のままです。それはあなたがそのオブジェクトのグローバルな名前を変更してもそれに従うだけです。任意の名前を選択し、コンパイラの生成された名前を置き換えます。私はこれを示す以下のコードをいくつか追加しました。初期化が必要な辞書についても、<> f_switch $ mapnと呼ばれる辞書ごとに新しいインスタンスを最適化して作成します。ここでnはカウンタです。

また、バッキングフィールドが自動生成されたプロパティについても同様のナンセンスを扱います。しかし、同じ修正。独自のバッキングフィールドを作成して使用します。


[CompilerGenerated] 
internal class <PrivateImplementationDetails> 
{ 
    // Fields 
    internal static $ArrayType$4 $$field-0; // data size: 4 bytes 
    internal static $ArrayType$4 $$field-1; // data size: 4 bytes 
    internal static $ArrayType$4 $$field-2; // data size: 4 bytes 
    internal static $ArrayType$4 $$field-3; // data size: 4 bytes 
    internal static $ArrayType$44 $$field-4; // data size: 44 bytes 
    internal static $ArrayType$4 $$field-5; // data size: 4 bytes 

    // Nested Types 
    [StructLayout(LayoutKind.Explicit, Size=4, Pack=1)] 
    private struct $ArrayType$4 
    { 
    } 

    [StructLayout(LayoutKind.Explicit, Size=0x2c, Pack=1)] 
    private struct $ArrayType$44 
    { 
    } 
} 

static GATWavHelper() 
{ 
    riffBytes = new byte[] { 0x52, 0x49, 70, 70 }; 
    waveBytes = new byte[] { 0x57, 0x41, 0x56, 0x45 }; 
    fmtBytes = new byte[] { 0x66, 0x6d, 0x74, 0x20 }; 
    dataBytes = new byte[] { 100, 0x61, 0x74, 0x61 }; 
    headerSize = 0x2c; 
    floatToInt16RescaleFactor = 0x7fff; 
    __canonicalHeader = new byte[] { 
     0x52, 0x49, 70, 70, 0, 0, 0, 0, 0x57, 0x41, 0x56, 0x45, 0x66, 0x6d, 0x74, 0x20, 
     0, 0, 0, 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 100, 0x61, 0x74, 0x61, 0, 0, 0, 0 
    }; 
} 

// Fields 
[CompilerGenerated] 
private static Dictionary<string, int> <>f__switch$map0; 
. 
. 
. 
if (<>f__switch$map0 == null) 
{ 
    Dictionary<string, int> dictionary = new Dictionary<string, int>(3); 
    dictionary.Add("false", 0); 
    dictionary.Add("true", 1); 
    dictionary.Add("null", 2); 
    <>f__switch$map0 = dictionary; 
} 

if (<>f__switch$map0.TryGetValue(nextWord, out num)) 
{ 
    switch (num) 
. 
. 
. 
関連する問題