如何使用反射获取所有引用的程序集? (.net4)

How to get all the referenced assemblies using reflection ? (.net4)

我编写了一段代码,它为我提供了一个程序集(在 .net5 中)的引用程序集,它工作得很好,例如,如果我使用 File.WriteAllText 方法程序集“System.IO.FileSystem”(这是通过使用 Assembly.GetReferencedAssemblies 方法)。

但现在我需要让此代码在 .NET4(适用于 Unity 引擎)上运行。但我已经看到 myAssembly.GetReferencedAssemblies 没有提供与 .NET5 中相同的输出。

它现在只给我:myAssembly.dll 和 mscorlib.dll

而且我无法像以前那样为我提供所有引用的程序集(例如系统或 System.IO ...)

这是一个简单的例子:

    using System.IO;

    public class Plugin {

         static Plugin() {

             // Just use the File class to keep the System.IO assembly reference
             File.WriteAllText("test", string.Empty);

         }

    }

    public static void Test() {

        string myPluginPath = "myAssembly.dll";

        // Load the assembly
        Assembly assembly = Assembly.LoadFrom(myPluginPath);

        // Get all the referenced assemblies
        foreach (AssemblyName name in assembly.GetReferencedAssemblies()) {

            Console.WriteLine(name.Name);

            // Different outputs:
            //
            // .NET 5
            // - System.IO.FileSystem
            // - ....
            // .NET 4
            // - mscorlib
            // - Plugin

        }

    }

知道如何让 myAssembly.GetReferencedAssemblies 在 .net4 上运行吗?谢谢!

Any idea how to make the myAssembly.GetReferencedAssemblies work on .net4?

System.IO.File 驻留在 .NET Framework 中的 mscorlib.dll 中,因此两个版本都可以正常工作。为什么需要实际的程序集名称?您不能跨平台依赖它们。

另一方面,如果您需要它来解析程序集限定的类型名称,那么您可以使用遗留程序集标识来实现,因此 Type.GetType("System.IO.File, mscorlib, Version=4.0.0.0") 也适用于 .NET 5。

这是因为即使在较新的平台上也有一个 mscorlib.dll,它只包含一堆 [assembly:TypeForwardedTo(...)] 属性,这些属性提供到新位置的重定向。

但它不会以相反的方式工作,所以不要期望您可以从 .NET Framework 4.0

中的 System.IO.FileSystem.dll 解析类型 File

评论后更新:

在 .NET Framework 中,handling potentially harmful plugins is creating separate AppDomains for them with restricted permissions. Here is an example from my unit tests to create such a sandbox domain and here 的最佳方式是示例用法。 AppDomain 甚至可以与其引用的程序集一起卸载。

坏消息是,这在 .NET 5 中不起作用,因为从 .NET Core 开始,您无法再创建 AppDomains(如果您已经有了 .NET 5 的解决方案,这不是什么大问题) .但为了完整起见:从 .NET Core 3.0 开始,AssemblyLoadContext 类型是 recommended way for handling plugins. Though it does not create a restricted environment the same way as AppDomain, you can use AssemblyDependencyResolver 来控制插件的程序集加载请求。