我有以下LINQ导致我的混淆器破坏。
.Where(f => f.FileName == fileName).OrderByDescending(f => f.Position).FirstOrDefault();
还有另一种方法可以改写这个LINQ语句来测试我的混淆器吗?
我已经报告了这个错误,但是修复可能需要1-2个月,所以我需要在此期间尝试重新编码这个LINQ。
更新
LINQ中的确切原因是:
.Where(f => f.FileName == fileName)
答案 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)
如果存在损坏的工具,则无法提供有保证的修复。你必须修补它。尝试交换Where
和OrderBy...
。或许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)>
如果你有更重的域对象和其他你想要混淆的代码,那么最小排除似乎是:
在这些情况下,您只需使用更轻量级的表单。
<Obfuscation(Exclude:=True)> Public Property ID As Integer