【问题标题】:Obfuscated DLL not loading via Reflection混淆的 DLL 不通过反射加载
【发布时间】:2014-03-17 13:19:24
【问题描述】:

我的应用程序中有一个接口,以及几个扩展它的 DLL。该接口提供了一种简单的方法:

public interface ICustomConversion
{
    string Namespace { get; }
    string Code { get; }

    int TotalCount { get; set; }
    int ErrorCount { get; set; }

    string ConvertList(string inputFileLocation);
}

目标是允许将多个文件转换为我们的自定义格式。我通过反射根据用户选择加载 DLL:

 var dll = Assembly.LoadFrom(path);
 var type = dll.GetTypes().First();
 var instance = (ICustomConversion)Activator.CreateInstance(type);
 return instance.ConvertList(filename);

这一切都在开发环境中运行良好。但是,混淆后,它无法加载 dll,我不知道为什么。在混淆的 DLL 上使用 ILSpy 显示方法签名仍然相同:

我很好奇这里有什么问题。对混淆程序集的反射是否会以某种方式中断?以前有没有其他人遇到过这个错误?感谢您的任何见解。

更新

看起来这一行正在引发异常:

var instance = (ICustomConversion)Activator.CreateInstance(type);

【问题讨论】:

  • 混淆是如何完成的?如果不执行,DLL 是否加载?
  • 是的,对不起,我是想把它包括在内。如果我把未混淆的 DLL 扔进去,它可以正常工作
  • 然后我会说混淆器不起作用
  • .pdb 文件是否也存在?只是想知道 ILSpy 是否也使用它来帮助它查看正确的名称
  • dll.GetTypes().First();返回什么类型?改用typeof(KnownType)

标签: c# reflection interface obfuscation


【解决方案1】:

这一行只是获取 DLL 声明的第一个类型:

var type = dll.GetTypes().First();

这不是一个好习惯。您应该根据某些标准选择类型。

混淆可能会改变程序集中类型的顺序(可能是由于名称更改)。

我建议您改为这样做:

var type = dll.GetTypes().First(typeof(ICustomConversion).IsAssignableFrom);

这将选择实现你的接口的第一个类型。

【讨论】:

  • 你完全正确。那解决了它。非常感谢。
猜你喜欢
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
相关资源
最近更新 更多