你可以加载程序集,但是GetTypes()
和GetExportedTypes()
依赖于程序集中的公共类,如果它们有外部引用,就会出现此异常。
答案:
这意味着该程序集的Types
取决于其他程序集,当前的.NetCore在运行时无法访问其他依赖程序集,因为它无法连接到其他依赖程序集。
解决方案:
获取DLL程序集的依赖项并编译所有依赖项,然后迭代加载每个程序集以获取所有导出类型(即公开可见类型)
代码:
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Loader;
using Microsoft.Extensions.DependencyModel;
class Program
{
static void Main(string[] args)
{
var asl = new AssemblyLoader();
var asm = asl.LoadFromAssemblyPath(@"C:\temp\Microsoft.AspNetCore.Antiforgery.dll");
try
{
var y = asm.GetExportedTypes();
Console.WriteLine(y);
}
catch (Exception e1)
{
Console.WriteLine("Got exception at first attempt of GetExportedTypes ");
Console.WriteLine("\t*********" + e1.Message + "**************");
var deped = asl.CallForDependency(asm.GetName());
try
{
Console.WriteLine("\n" + deped.ToString());
Console.WriteLine("----------All Exported Types------------");
foreach (var item in deped.ExportedTypes)
{
Console.WriteLine(item);
}
}
catch (Exception e2)
{
Console.WriteLine("Got exception at second attempt of GetExportedTypes ");
Console.WriteLine("\t*********" + e2.Message + "**************");
}
}
Console.ReadLine();
}
}
public class AssemblyLoader :AssemblyLoadContext
{
protected override Assembly Load(AssemblyName assemblyName)
{
var deps = DependencyContext.Default;
var res = deps.CompileLibraries.Where(d => d.Name.Contains(assemblyName.Name)).ToList();
var assembly = Assembly.Load(new AssemblyName(res.First().Name));
return assembly;
}
public Assembly CallForDependency(AssemblyName assemblyName)
{
return this.Load(assemblyName);
}
}
输出:
Got exception at first attempt of GetExportedTypes
*********Could not load file or assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. An operation is not legal in the current state. (Exception from HRESULT: 0x80131509)**************
Microsoft.AspNetCore.Antiforgery, Version=2.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
----------All Exported Types------------
Microsoft.Extensions.DependencyInjection.AntiforgeryServiceCollectionExtensions
Microsoft.AspNetCore.Antiforgery.AntiforgeryOptions
Microsoft.AspNetCore.Antiforgery.AntiforgeryTokenSet
Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException
Microsoft.AspNetCore.Antiforgery.IAntiforgery
Microsoft.AspNetCore.Antiforgery.IAntiforgeryAdditionalDataProvider
Microsoft.AspNetCore.Antiforgery.Internal.AntiforgeryFeature
Microsoft.AspNetCore.Antiforgery.Internal.AntiforgeryOptionsSetup
Microsoft.AspNetCore.Antiforgery.Internal.AntiforgerySerializationContext
Microsoft.AspNetCore.Antiforgery.Internal.AntiforgerySerializationContextPooledObjectPolicy
Microsoft.AspNetCore.Antiforgery.Internal.AntiforgeryToken
Microsoft.AspNetCore.Antiforgery.Internal.BinaryBlob
Microsoft.AspNetCore.Antiforgery.Internal.CryptographyAlgorithms
Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery
Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryAdditionalDataProvider
Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenGenerator
Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer
Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenStore
Microsoft.AspNetCore.Antiforgery.Internal.DefaultClaimUidExtractor
Microsoft.AspNetCore.Antiforgery.Internal.IAntiforgeryFeature
Microsoft.AspNetCore.Antiforgery.Internal.IAntiforgeryTokenGenerator
Microsoft.AspNetCore.Antiforgery.Internal.IAntiforgeryTokenSerializer
Microsoft.AspNetCore.Antiforgery.Internal.IAntiforgeryTokenStore
Microsoft.AspNetCore.Antiforgery.Internal.IClaimUidExtractor
ReflectionTypeLoadException的参考和解释:
Assembly.GetTypes方法()
ReflectionTypeLoadException
反射加载异常 (ReflectionTypeLoadException)。
该程序集包含一个或多个无法加载的类型。此异常的 Types
属性返回一个 Type 对象数组,其中包含已加载的每个类型和无法加载的每个类型的 null 值,而 LoaderExceptions
属性包含每个无法加载的类型的异常。
备注
返回的数组包括嵌套类型。
如果在程序集上调用 GetTypes
方法,并且该程序集中的某个类型依赖于尚未加载的另一个程序集中的类型(例如,如果它从第二个程序集派生),则会引发 ReflectionTypeLoadException
。例如,如果使用 ReflectionOnlyLoad
或 ReflectionOnlyLoadFrom
方法加载了第一个程序集,并且未加载第二个程序集,则可能会发生这种情况。如果在调用 GetTypes
方法时不能找到第二个程序集,则使用 Load 和 LoadFile
方法加载的程序集也可能会出现这种情况。
注意
如果将类型转发到另一个程序集,则不包括在返回的数组中。有关类型转发的信息,请参见“公共语言运行库 (CLR) 中的类型转发”。
链接 :
dllPath
是什么? - Daniel A. White$(TargetPath)
- maxswitcherdotnet tsgenerator "$(TargetPath)"
- maxswitcher