{guid} .method $$ **** in code file。コンパイルしません!
-
10-10-2019 - |
質問
Reflectorの生成されたファイルの1つに、メソッドのスニペットがある別のプロジェクトからの.NETアセンブリがあります。
現在、2010年のC#コンパイラは、あらゆる種類のコンパイルエラーをスローします$$予期しません。ブレースを閉じるなど
Ildasmでは、この方法は他の多くの方法と一緒に言及されていますが、生成されたコードでは、これらのコンパイラ層化されたメソッドのうち1つだけが入っていることがわかります。
コンパイルを行うにはどうすればよいですか?
解決
これらは通常によって作成されます static readonly
配列。それらをコンパイルしません。また、リフレクターは、特に些細なコード以外のものをバグのように再現しています。
元のソースコードを入手することをお勧めします。
他のヒント
それらはコンパイラによって自動的に生成されますが、私はLambda Expressionオブジェクトのようなもの(あなたが名前を提供しない)のようなものを信じています。コンパイラがあなた自身のコードと矛盾していないことを確認したいので、それらは無効な名前だと思います。再コンパイルする前に、名前を変更する必要があります。
私がこれを見たすべての場合において、それは配列初期剤に関係しています。作成されたタイプを確認すると、コンパイラが初期化した各サイズ配列に異なる構造体を作成したばかりであることに気付きます。コンパイラはこれを行い、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)
.
.
.
ビュー]メニューから、[オプション]を選択します。
最適化の選択を確認します。 VSの最新バージョンを使用しているため、.NET 4.0または少なくとも3.5を最適化してLambdasのサポートを得るために指定する必要があります。