You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.NET DLL反编译为C#项目遇[CompilerGenerated]代码如何修复构建?

修复DotPeek反编译生成的DLR站点容器代码构建问题

嘿,我来帮你搞定这个问题——你看到的这段代码根本不是用来直接编译的!先给你拆解清楚:

你贴的<Importuj>o__SiteContainer0类,是C#编译器处理dynamic关键字时自动生成的DLR调用站点缓存容器,用来优化动态调用的性能。这类代码用了C#语法不允许的特殊标识符(比如<>),所以直接拿来构建肯定报错——它们本来就是编译器内部用的“黑盒代码”,不是手写的业务逻辑。

下面是具体的修复步骤,一步步来:

  • 第一步:还原原代码的动态逻辑
    先搞清楚Importuj方法原本是做什么的——这些CallSite对应的都是对Excel对象(比如WorksheetRange)的动态调用。举个例子,原代码大概率是类似这样的:

    dynamic excelObj = GetExcelObject();
    Worksheet sheet = excelObj.Sheets["Data"]; // 对应你看到的<>p__Site1
    bool isSheetValid = sheet != null; // 对应<>p__Site2
    // 还有其他对Range、Excel对象的动态操作
    
  • 第二步:用强类型替换动态调用
    既然是操作Excel,直接用强类型的Interop程序集彻底替代dynamic,这是最稳妥的方案:

    1. 先给项目添加Microsoft.Office.Interop.Excel的引用(直接在NuGet里搜这个包就能安装)
    2. 把原来的动态调用改成强类型代码,比如:
      using Excel = Microsoft.Office.Interop.Excel;
      
      // 替换动态调用的示例代码
      Excel.Application excelApp = new Excel.Application();
      Excel.Workbook workbook = excelApp.Workbooks.Open(@"C:\your-file.xlsx");
      Excel.Worksheet targetSheet = workbook.Worksheets["Sheet1"];
      bool sheetExists = targetSheet != null;
      Excel.Range dataRange = targetSheet.Range["A1:C10"];
      

    这样一来,编译器就不需要生成那些奇怪的CallSite容器类了,代码也能正常编译。

  • 第三步:彻底清理反编译的垃圾代码
    直接删掉所有带[CompilerGenerated]标记的o__SiteContainer0这类自动生成的类——这些都是编译器的临时产物,留着只会添乱,完全不需要保留。

  • 第四步:排查其他反编译遗留问题
    反编译的代码可能还会有其他编译器生成的类(比如异步状态机、迭代器容器),处理逻辑一样:先识别对应的业务逻辑,改成正常的C#代码,然后删掉自动生成的容器类。

内容的提问来源于stack exchange,提问作者Lucyper

火山引擎 最新活动