1

我正在尝试为我的.NET 4.7.2 Framework App 编写插件系统。

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

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

错误第 1 部分

错误第 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 或这个“免费混淆器”

我也很肯定这些错误是由于插件系统而发生的,因为当没有插件加载混淆版本时这样做没有问题。

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

我也会向其他免费的混淆器提出一些建议,只要它们能很好地保护我的代码并且可以很好地使用这个插件加载设置(顺便说一下,Constants.Foldername 只是“插件”)

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

4

1 回答 1

2

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

相关阅读: 您是否应该混淆商业 .Net 应用程序?

于 2021-02-20T00:08:17.703 回答