混淆的DLL不通过Reflection加载

Jon*_*lis 2 c# reflection obfuscation interface

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

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

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

    string ConvertList(string inputFileLocation);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

ILSpy

我很好奇这里的问题是什么.对模糊组件的反思是否会以某种方式破坏?有没有其他人遇到此错误?感谢您的任何见解.

UPDATE

看起来这一行抛出异常:

var instance = (ICustomConversion)Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)

Mår*_*röm 5

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

var type = dll.GetTypes().First();
Run Code Online (Sandbox Code Playgroud)

这不是好习惯.您应该根据某些条件选择类型.

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

我建议你这样做:

var type = dll.GetTypes().First(typeof(ICustomConversion).IsAssignableFrom);
Run Code Online (Sandbox Code Playgroud)

这将选择实现您的界面的第一种类型.