如何使用反射获取所有引用的程序集? (.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 AppDomain
s 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 开始,您无法再创建 AppDomain
s(如果您已经有了 .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
来控制插件的程序集加载请求。
我编写了一段代码,它为我提供了一个程序集(在 .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 AppDomain
s 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 开始,您无法再创建 AppDomain
s(如果您已经有了 .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
来控制插件的程序集加载请求。