C# 混淆 .NET 可执行文件破坏了加载程序集的使用

C# Obfuscating .NET Executable breaks the use of Loading Assemblies

我正在尝试为我的 .NET 4.7.2 Framework 应用程序编写一个插件系统。

我已经写好了代码,但是有一个问题,当应用程序被混淆时,插件系统在启动时抛出错误。

下面有两张图片应该很可能解释了错误,但我也会提供文本的复制和粘贴。

Error Part 1

Error Part 2

错误文本:

   System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
   at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
   at System.Reflection.RuntimeModule.GetTypes()
   at System.Reflection.Assembly.GetTypes()
   at @ӛ.<>c.<LoadPlugins>b__4_0(Assembly a)
   at System.Linq.Enumerable.<SelectManyIterator>d__17`2.MoveNext()
   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at @ӛ.@ӗ()
   at @Ӗ..ctor()
   at @Ӕ.<checkForPreviousLogin>d__2.MoveNext()
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.<ThrowAsync>b__6_0(Object state)

加载插件的代码段:

public class PluginLoader
    {
        public static List<IPlugin> Plugins { get; set; }

        public void LoadPlugins()
        {
            Plugins = new List<IPlugin>();

            //Load the DLLs from the Plugins directory
            if (Directory.Exists(Constants.folderName))
            {
                string[] files = Directory.GetFiles(Constants.folderName);
                foreach (string file in files)
                {
                    if (file.EndsWith(".dll"))
                    {
                        Constants.raidTool.log("Loading Plugin File: " + Path.GetFullPath(file));
                        Assembly.LoadFile(Path.GetFullPath(file));
                    }
                }
            }

            Type interfaceType = typeof(IPlugin);
            //Fetch all types that implement the interface IPlugin and are a class
            Type[] types = AppDomain.CurrentDomain.GetAssemblies()
                .SelectMany(a => a.GetTypes())
                .Where(p => interfaceType.IsAssignableFrom(p) && p.IsClass)
                .ToArray();
            foreach (Type type in types)
            {
                //Create a new instance of all found types
                Plugins.Add((IPlugin)Activator.CreateInstance(type));
            }
            
            foreach (IPlugin plugin in Plugins)
            {
                plugin.Start();
            }
        }
        public void ShutdownPlugins()
        {
            foreach (IPlugin plugin in Plugins)
            {
                plugin.Shutdown();
            }
        }
        public void WebRequestPlugin(HttpWebRequest request)
        {
            foreach (IPlugin plugin in Plugins)
            {
                plugin.OnNetworkRequest(request);
            }
        }
    }

请记住此错误不会在应用程序未被混淆时发生。

我也尝试过不同的混淆器,例如 ConfuserEx 或 this "free obfuscator"

此外,我肯定这些错误是由于插件系统造成的,因为当没有插件加载时,混淆版本没有问题。

如果您需要我澄清或解释某些事情,请告诉我!

我也会向其他免费混淆器推荐一些 long,因为它们可以很好地保护我的代码,并且可以很好地使用此插件加载设置(顺便说一句,Constants.Foldername 是只是“插件”)

我对堆栈溢出还是很陌生,所以如果我搞砸了,我真的很抱歉!

我会避免在任何使用混淆的项目上使用反射。反射查看程序集的方式与您试图阻止人们查看您的程序集的方式相同。换句话说,如果反射完美运行,那么您就没有保护您的代码。

相关阅读: Should you obfuscate a commercial .Net application?