代码文件中的<privateimplementationdetails> {GUID} .method $$ ****。不编译!</privateimplementationdetails>

时间:2010-12-15 07:17:08

标签: c# .net-reflector

我们有一个来自另一个项目的.NET程序集,其中一个来自Reflector的生成文件有一个方法的片段。

现在VS 2010 c#编译器抛出各种编译错误$$意外。关闭括号等。

在ILDASM中,我看到了这个方法以及提到的许多其他方法,但在生成的代码中,我发现只有其中一个编译器生成的方法进入。

如何进行编译?

4 个答案:

答案 0 :(得分:4)

这些通常由static readonly数组创建。你不会编译它们。另外,Reflector特别是在重新创建除了琐碎的代码之外的任何东西。

我建议您获取原始源代码。

答案 1 :(得分:2)

这些是由编译器自动生成的,我相信像lambda表达式对象(你没有提供任何名称)。我认为它们的名称无效,正是因为编译器希望确保与您自己的代码没有任何冲突;在重新编译之前,你只需要重命名它们。

答案 2 :(得分:1)

在所有情况下,我都看到过它与Array初始化器有关。如果你看一下在你创建的类型,你会注意到编译器刚为你初始化的每个大小数组创建了一个不同的结构。编译器这样做是为了减少IL大小,加快数组元素的内存分配,并将数组元素按顺序保存在内存中。如果没有深入了解杂草,我只会提到以这种方式进行操作意味着任何大小的数组初始化都发生在已知且常数的IL指令中。我不记得我在ILDasm中的挖掘,但我认为它是4.每次分配一个意味着每个元素有4条指令。

现在针对您的具体问题。一旦你意识到你只是在处理需要重命名的值类型实例,这并不是那么糟糕。一些在反射器中搜索应该揭示使用编译器生成对象的实例。原始声明和初始化将在源中保持不变。这就是你需要关注该对象的全局重命名。选择您想要的任何名称并替换编译器生成的名称。我在下面放了一些其他代码来说明这一点。对于需要初始化的字典,它会优化并为每个字典创建一个名为&lt;&gt; 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)
.
.
.

答案 3 :(得分:0)

从视图菜单中,选择选项。

验证优化选择。由于您使用的是最新版本的VS,因此您应指定优化.Net 4.0或至少3.5以获得对lambda的支持。