【发布时间】:2020-10-25 15:25:09
【问题描述】:
如何从 dll 中获取实现特定接口的所有类的名称。我正在尝试将旧版 .Net Windows Form 应用程序移植到 Blazor Server 应用程序,并且遇到了旧代码不再工作的问题。谁能解释这是如何实现的?下面是抛出异常“无法加载文件或程序集'XXX,Version = 1.0.0.0,Culture = Neutral,PublicKeyToken = null'的旧代码。系统找不到指定的文件。”
class AssemblyLoader : MarshalByRefObject
{
public AssemblyLoader()
{ }
public List<string> Load(string AssemblyFilePath)
{
var SelectedAssembly = System.Reflection.Assembly.LoadFrom(AssemblyFilePath);
var Types = GetTypesSafely(SelectedAssembly);
var FilteredTypes = Types.Where(x => x.GetInterface("ITestNode") != null && !x.IsAbstract);
List<string> TestNodes = new List<string>();
foreach (Type FilteredType in FilteredTypes)
{
TestNodes.Add(FilteredType.FullName);
}
return TestNodes;
}
private IEnumerable<Type> GetTypesSafely(Assembly SelectedAssembly)
{
try
{
return SelectedAssembly.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
return ex.Types.Where(x => x != null);
}
}
}
main()
{
AppDomainSetup DomainSetup = new AppDomainSetup();
DomainSetup.ShadowCopyFiles = "true";
var Domain = AppDomain.CreateDomain("loader", null, DomainSetup);
var Handle = Domain.CreateInstanceFrom(Assembly.GetExecutingAssembly().Location, typeof(AssemblyLoader).FullName);
AssemblyLoader Loader = Handle.Unwrap() as AssemblyLoader;
var Types = Loader.Load(@"C:\MyAssembly.dll");
AppDomain.Unload(Domain);
return Types;
}
【问题讨论】:
-
试试
Assembly.LoadFile("path_to_DLL").GetTypes().Where(t => typeof(IFoo).IsAssignableFrom(t))。 -
@Enigmativity 这给了我异常“无法加载文件或程序集'XXX,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null'。系统找不到指定的文件。”。需要指出的一点是,我要加载的库是 .net framework 4.6
-
有人愿意解释否决票吗?
-
继续尝试
Assembly.Load*方法。他们应该做你需要的。
标签: .net .net-core reflection blazor-server-side