.net加载失败的程序集实现重新加载

在.net程序中,程序集是Lazy加载的,只有在用的时候才会去加载,当程序集加载失败时,会触发AppDomain.AssemblyResolve的事件,在这个事件中,我们甚至还可以进行补救,从别得地方重新加载程序集。

AppDomain.CurrentDomain.AssemblyResolve += (s, e) =>
{
    byte[] content = getLibBytes(e.Name);
    return Assembly.Load(content);
};

这个功能如果使用起来就非常灵活了,它可以控制我们自由控制程序集的加载方式。常用的方法有如下几个:

程序集保护:

.net程序是非常容易反编译的,这个特性提供了混淆外的另一个方式。由于动态调用的方式下,程序集不需要是原始dll,甚至都不需要存储在磁盘上。可以通过直接不让使用者获取到程序集的dll的方式防止反编译。

发布的程序的时候,不直接发布需要保护的程序集,将程序集加密后发布,或者直接加密后存储在服务器上。使用的时候,在AssemblyResolve中获取加密后的程序集,解密后返回。

程序集合并:

WPF程序由于使用了反射,使用传统的ILMerge的方式合并后,由于程序集变化了,往往不能正常工作。

有很多工具,通过将程序集合并到exe的资源文件中,使用的时候,再在ssemblyResolve中从资源文件中获取程序集返回。

客户端更新:

CS模式的程序一个不足就是更新不方便,可以将程序集存储在文件数据库中,直接更新程序集数据库就可以很方便的实现程序集更新。

程序集存储分离:

使用微服务模式时,很多部署在同一个服务器上的服务共用着相同的程序集(第三方的Nuget库),这些程序集更新频率很低,并且混在一起存储使得我们不容易找到业务程序集。

可以将这些程序集集中存储在独立的位置。服务文件夹中只发布我们的业务程序集,看起来更加清晰,更新也更加方便。

.net core

在.net core中,这个机制也是可以使用的,不过接口发生了一点变化:

AssemblyLoadContext.Default.Resolving += (context, assembly) =>
{
    var content = getLibBytes(assembly.FullName);
    return Assembly.Load(content);
};

需要说明的是,如果是使用 dotnet xxx.dll 的方式运行的话,dotnet 程序会首先通过 xxx.deps.json文件来获取所有相关的依赖性,从而还没有进入程序就报错。

可以通过修改 xxx.deps.json去掉依赖项,或者干脆直接删掉xxx.deps.json解决这个问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • .NET Core 3.0 可回收程序集加载上下文的实现

    一.前世今生 .NET诞生以来,程序集的动态加载和卸载都是一个Hack的技术,之前的NetFx都是使用AppDomain的方式去加载程序集,然而AppDomain并没有提供直接卸载一个程序集的API,而是要卸载整个AppDomain才能卸载包含在其中的所有程序集.然而卸载整个CurrentAppDomain会使程序不能工作.可能有人另辟西经,创建别一个AppDomain来加载/卸载程序集,但是由于程序集之间是不能跨域访问的,也导致只能通过Remote Proxy的方式去访问,这样在类型创建和使用

  • asp.net 未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。

    说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.BadImageFormatException: 未能加载文件或程序集"XXX"或它的某一个依赖项.试图加载格式不正确的程序. 源错误: 执行当前 Web 请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息. 程序集加载跟踪: 下列信息有助于确定程序集"XXX"无法加载的

  • C#中调用DLL时未能加载文件或程序集错误的处理方法(详解)

    在加载DLL时,出现了如下的异常:未能加载文件或程序集"DMC3000, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"或它的某一个依赖项. 试图加载格式不正确的程序. 经上网查询后,其原因是x64和x86不兼容的问题.即DLL是x64的,但是VS默认生成的目标平台是x86的,因此,两者的不一致导致异常的出现. 其解决办法如下: 项目->属性->生成->目标平台->x64(与dll平台一致) 以上这篇

  • C# 动态加载程序集信息

    在设计模式的策略模式中,需要动态加载程序集信息,本文通过一个简单的实例,来讲解动态加载Dll需要的知识点. 涉及知识点: AssemblyName类,完整描述程序集的唯一标识, 用来表述一个程序集. Assembly类,在System.Reflection命名空间下,表示一个程序集,它是一个可重用.无版本冲突并且可自我描述的公共语言运行时应用程序构建基块. Module类 表述在模块上执行反射,表述一个程序集的模块信息. Type类,在System命名空间下,表示类型声明:类类型.接口类型.数组

  • 未能加载文件或程序集“AspNetPager”或它的某一个依赖项。拒绝访问

    未能加载文件或程序集"AspNetPager"或它的某一个依赖项.系统找不到指定的路径. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.IO.FileNotFoundException: 未能加载文件或程序集"AspNetPager"或它的某一个依赖项.系统找不到指定的路径. 源错误: 执行当前 Web 请求期间生成了未经处理的异常.可以使用下面的异常堆

  • C#使用反射加载多个程序集的实现方法

    当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法. 创建一个控制台应用程序,首先设计一个接口: public interface ISay { void SaySth(); } 在控制台应用程序下创建Plugins文件夹,控制台的可执行文件和所有程序集文件都生成在这里.右键控制台项目--"属性"--"生成",把"输出路径"设置成Plugins文件夹. 创建类库项目Assembly1,添加对控制台项目的引用,并创建实

  • 未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。

    "/xxxxx"应用程序中的服务器错误. -------------------------------------------------------------------------------- 未能加载文件或程序集"xxx"或它的某一个依赖项.试图加载格式不正确的程序. 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.BadImageFormatE

  • .net加载失败的程序集实现重新加载

    在.net程序中,程序集是Lazy加载的,只有在用的时候才会去加载,当程序集加载失败时,会触发AppDomain.AssemblyResolve的事件,在这个事件中,我们甚至还可以进行补救,从别得地方重新加载程序集. AppDomain.CurrentDomain.AssemblyResolve += (s, e) => { byte[] content = getLibBytes(e.Name); return Assembly.Load(content); }; 这个功能如果使用起来就非常灵

  • 解决JSON数据因为null导致数据加载失败的方法

    一.首先分析问题: 使用NSJSONSerialization或者AFN框架的AFHTTPSessionManager(底层也是NSJSONSerialization)将NSData数据转化成OC对象,有时会出现URL正确,加载数据任然会报错: reason: '-[NSNull length]: unrecognized selector sent to instance 分析原因发现,转化出来的OC对象中含有null.所以,NSNull没有length方法,所以会报找不到方法错误. 二.解决

  • jQuery处理图片加载失败的常用方法

    本文实例讲述了jQuery处理图片加载失败的常用方法.分享给大家供大家参考.具体如下: 这里演示用 jQuery 替换源来提醒用户加载失败及隐藏的方法. // 方法 1:更换图片地址 $('img').error(function(){ $(this).attr('src', '加载失败.png'); }); // 方法 2:隐藏它 $("img").error(function(){ $(this).hide(); }); 希望本文所述对大家的jQuery程序设计有所帮助.

  • JavaScript判断图片是否能够加载,失败则替换默认图片

    一为使网站整洁,二来提升网页体验,不至于让别人觉得你这网站有问题.其实实现起来也是非常简单的,具体请看看代码. 图片加载失败时用默认图片替代 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

  • wwjod.dll加载失败,win32.troj.mnless.82432的清除方法

    每次启动机器就会提示,c:\windows\system32\wwjod.dll加载失败,拒绝访问. 使用sreng,启动项目-win32服务和应用程序删除 [KLJS_Server / KLJS][Stopped/Disabled]   <><N/A> 驱动程序删除 [ragq / ragqm][Running/Boot Start]   <\SystemRoot\System32\DRIVERS\ragqm.sys> 系统修复-浏览器加载项删除 [apronA Cl

  • hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    对这种懒加载问题,最后的做法是利用Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,使得Hibernate的Session的生命周期变长,直到这个请求结束,具体是通过一个Filter来实现的. 那么,如果现在我们想用Hibernate懒加载特性,又想用延长session的生命周期,知道将数据提到页面显示(经过action层),那么我们就得在web.xml文件中增加以下配置: <!-- 配置

  • 关于Webpack dev server热加载失败的解决方法

    利用Webpack dev server作为热加载服务器时,出现以下错误: XMLHttpRequest cannot load http://localhost:8080/dist/06854fc8988da94501a9.hot-update.json. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not

随机推荐