LINQ导致我的混淆器破裂

时间:2010-04-29 11:58:27

标签: c# linq

我有以下LINQ导致我的混淆器破坏。

.Where(f => f.FileName == fileName).OrderByDescending(f => f.Position).FirstOrDefault();

还有另一种方法可以改写这个LINQ语句来测试我的混淆器吗?

我已经报告了这个错误,但是修复可能需要1-2个月,所以我需要在此期间尝试重新编码这个LINQ。

更新

LINQ中的确切原因是:

.Where(f => f.FileName == fileName)

4 个答案:

答案 0 :(得分:3)

问题究竟是如何显现的?由于C#表达式编译器(在上面的LINQ中使用)直接使用memberinfo标记 (而不是依赖于字符串作为反射),我看不出你可以做得更好。同样,假设它是一个IL混淆器(不是源混淆器),重写它作为查询表达式应该什么都不做,nix,zip,zero和nada。你可以试试......

var first = (from f in [whatever]
             where f.FileName == fileName
             orderby f.Position descending
             select f).FirstOrDefault();

到底发生了什么?


根据评论进行编辑:如果问题是“捕获”,您可以尝试使用常量(而不是捕获的值)手动构建表达式 - 其中Foo是您的类型:

    var param = Expression.Parameter(typeof(Foo), "f");
    var body = Expression.Equal(Expression.PropertyOrField(param, "FileName"),
        Expression.Constant(filename));
    var predicate = Expression.Lambda<Func<Foo, bool>>(body, param);

然后使用:

    .Where(predicate).OrderByDescending(f => f.Position).FirstOrDefault();

问题当然是说服“FileName”和Foo.FileName必须保持不变......


这是一个不需要字符串的版本:

    Expression<Func<Foo, string>> liftFileName = foo => foo.FileName;
    var predicate = Expression.Lambda<Func<Foo, bool>>(
        Expression.Equal(liftFileName.Body, Expression.Constant(filename)),
        liftFileName.Parameters);

答案 1 :(得分:0)

如果存在损坏的工具,则无法提供有保证的修复。你必须修补它。尝试交换WhereOrderBy...。或许FirstOrDefault()正在破裂,所以也许可以手工完成。实际上,即使OrderBy...也可以用一种排序替换。你可以尝试其他一些东西。

BTW,这是LINQ-to-SQL还是LINQ-to-Objects?他们的行为方式完全不同。

答案 2 :(得分:0)

解决方案是从混淆(重命名)中驱逐.FileName和.Position属性。

为了避免在每个查询中执行此操作,请切换到支持LINQ-to- *的混淆器,例如Crypto Obfuscator

答案 3 :(得分:0)

老帖子,但今天早上我遇到了这个问题。我正在使用.NET Reactor本身不支持混淆我的POCO用于LINQ to Entities。

如果您的混淆器尊重System.Reflection.ObfuscationAttribute,您可以使用它来排除您的实体和DbContext的混淆。

<Obfuscation(ApplyToMembers:=True, Exclude:=True)>

如果你有更重的域对象和其他你想要混淆的代码,那么最小排除似乎是:

  1. DbContext类名称
  2. 每个DbSet的属性名称
  3. 实体类名称
  4. 映射的实体属性
  5. 在这些情况下,您只需使用更轻量级的表单。

    <Obfuscation(Exclude:=True)> Public Property ID As Integer