我将自己的自定义加载器添加到AssemblyResolve中,以便在.net库中加载一些嵌入式资源;
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => { return Domain.Assemblies.LoadResource(e.Name, System.Reflection.Assembly.GetExecutingAssembly()); }; public static System.Reflection.Assembly LoadResource(string fileName, System.Reflection.Assembly assembly)
{
fileName = assembly.GetName().Name + "." + fileName.Split(',')[0] + ".dll";
var resFilestream = assembly.GetManifestResourceStream(fileName);
byte[] ba = new byte[resFilestream.Length];
resFilestream.Read(ba, 0, ba.Length);
var byteArray = ba;
resFilestream.Close();
resFilestream.Dispose();
return System.Reflection.Assembly.Load(byteArray);
}这在许多不同的环境(Winforms、Azure应用程序/webjobs/函数)中都很好,但是当我试图在asp.net(4.7.2) MVC站点中执行这段代码时,它破坏了防伪吗?此问题似乎与未正确加载DLL有关,并导致三个单独的错误。
TypeInitializationException: The type initializer for 'System.Web.Helpers.Claims.ClaimsIdentityConverter' threw an exception.FileLoadException: Could not load file or assembly 'Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. Invalid pointer (Exception from HRESULT: 0x80004003 (E_POINTER))NullReferenceException: Object reference not set to an instance of an object.如果删除在程序集加载dll中初始化类的对象,则站点工作时没有错误。如果我把它放回去,它就破了。我还尝试将代码从global.asax移动到内联c#,但一旦运行它,下一次加载带有伪造令牌的页面将以同样的方式出错。
在运行Fusion++以检查DLL加载后,我可以看到,在这两种情况下,错误的DLL实际上都有完全相同的加载失败(相当一般的“无法找到程序集”)。但是,只有当我加载我的DLL时,它才会显示为异常。
发布于 2022-07-21 12:20:35
问题不在于您的代码,而是这个依赖的Microsoft.IdentityModel:要在Windows环境中存在这种依赖关系和消费的可能性,很可能需要在GAC (全局程序集缓存)上安装dll和依赖项;如果Microsoft.IdentityModel不存在于GAC文件夹中,则代码将返回错误。
可以使用Visual安装Windows标识基础3.5,也可以从特性安装Windows Foundation3.5。
https://stackoverflow.com/questions/72829781
复制相似问题