当前位置: 首页 > news >正文

天津市建设工程备案网站可以登录国外网站吗

天津市建设工程备案网站,可以登录国外网站吗,wordpress手机主题浮动菜单,wordpress免签约微信支付了解程序集如何在C#xff03;.NET中加载我们一直在处理库和NuGet软件包。不管是好是坏#xff0c;高级.NET开发人员都需要了解.NET运行时如何加载程序集。这些库依赖于其他流行的库#xff0c;并且有很多共享的依赖项。有了足够大的依赖关系网络#xff0c;您最终将陷入冲… 了解程序集如何在C.NET中加载我们一直在处理库和NuGet软件包。不管是好是坏高级.NET开发人员都需要了解.NET运行时如何加载程序集。这些库依赖于其他流行的库并且有很多共享的依赖项。有了足够大的依赖关系网络您最终将陷入冲突或困境。处理此类问题的最佳方法是了解该机制在内部的工作方式。在本文中您将看到.NET进程如何以及何时加载引用的程序集。您将了解加载了哪个库版本当有多个可用版本时会发生什么以及为什么有时由于版本冲突而出现问题。您将看到如何调试这些类型的问题查看程序集绑定日志融合日志以及一些解决冲突的方法。程序集模块和引用让我们从围绕.NET流程的一些基本术语开始。一个装配在.NET是一个DLL或EXE文件。Visual Studio解决方案中的每个项目都被编译为一个程序集。每个程序集可以包含多个模块但是实际上我们几乎总是在一个程序集中有一个模块该模块的名称与该程序集相同。在Visual Studio中启动进程或单击F5时将执行启动项目程序集。除了.NET Framework或.NET Core程序集之外它将是第一个加载的程序集。之后该过程将根据需要在运行时加载其他程序集。仅当需要调用该程序集的方法或使用该程序集的类型时它才会延迟加载程序集。这里是为一个简单的“ Hello World” .NET Framework项目加载的模块出于我们所有的意图和目的模块和程序集都是相同的。MyStartup.dll是此处的启动项目.NET Core项目启动时加载的模块当您从另一个项目引用一个项目时在构建时被引用项目的DLL或EXE被复制到启动项目的Bin文件夹中。通常是Bin \ Debug或Bin \ Release。在运行时当您第一次使用引用的项目中的类型时CLR在应用程序目录中查找具有与期望的名称和版本相同的DLL文件。然后将程序集加载到流程中。这也称为绑定到装配件。这是一个例子假设我们有一个名为MyStartup的简单控制台应用程序它引用了另一个名为Lib1的项目。MyStartup使用Lib1程序集中的某些类。在MyStartup中class Program {static void Main(string[] args){int a int.Parse(Console.ReadLine());int b int.Parse(Console.ReadLine());Console.WriteLine(A B Add(a, b));}private static int Add(int a, int b){var calculator new Lib1.Calculator();return calculator.Sum(a, b);} } 在Lib1中public class Calculator {public int Sum(int a, int b){return a b;} } 输入Main方法时尚未加载Lib1程序集。但是在输入Add方法时CLR尝试解析Calculator类型找出它在引用的程序集Lib1中然后尝试加载该程序集。.NET中的程序集绑定当CLR需要加载程序集时逻辑实际上比在Bin文件夹中查找要复杂一些。这是执行的实际逻辑有关详细说明请参见Microsoft文档[1]1.根据配置文件app.config或web.config确定需要加载的程序集的版本。该配置文件的名称为在生成之后 [executable name].exe.config或web.config。绑定重定向在这里发挥了作用稍后会详细介绍。2.查看程序集是否已加载。如果加载了其他版本则将抛出FileLoadException除非它是一个可以同时加载多个版本的强命名程序集。3.如果它是强名称程序集请检查全局程序集缓存[2]GAC。GAC是机器上共享多个应用程序部件的地方。如果需要的话程序集会缓存。它只能存储强命名程序集。它可以存储同一程序集的不同版本。您可以使用gacutil.exe[3]自己将其安装到GAC 。4.如果它是一个强名称的程序集并且配置文件包含codeBase节点那么它将检查那里的程序集位置。如果该codeBase节点存在并且找不到程序集FileNotFoundException则将引发a。5.根据启发式算法检查程序集DLL或EXE。此过程称为“探测”。算法如下1.检查文件夹[application base] / [assembly name].dll。应用程序库是应用程序可执行文件所在的位置。通常您的Bin \ Debug或Bin \ Release文件夹。2.检查一下 [application base] / [assembly name] / [assembly name].dll3.如果为引用的程序集指定了区域性信息则仅检查以下目录 [application base] / [culture] / [assembly name].dll [application base] / [culture] / [assembly name] / [assembly name].dll4.如果该probing节点存在于配置文件中则它将在该privatePath节点的属性指定的文件夹中查找程序集。他们为什么要使所有事情变得如此困难对吗实际上这种逻辑非常有助于我们发展而不会使事情变得困难。它的存在是为了实现一些重要目标•为了确保您引用的是特定的程序集和版本则将加载该确切版本。否则将引发异常。而且如果您知道自己在做什么则可以在配置文件中指定覆盖规则绑定重定向。•为了灵活地在您要加载的程序集中进行。例如如果要根据不同的区域性语言加载不同的程序集则可以轻松地做到这一点。或者如果您要根据客户配置加载不同的程序集那也可以。•为了安全起见我们使用了全称的程序集。他们确保您不能“伪造”程序集。例如如果某个进程希望加载Lib1 v4.5那么您将无法加载具有相同名称和版本的恶意软件程序集。加载时会引发异常。这就是为什么在计算机上所有进程都共享的GAC只接受强名称程序集的原因。在大多数应用程序中您无需记住程序集加载和探测的复杂逻辑。您无需了解或考虑GAC全名程序集或操作配置文件。您几乎根本不需要考虑库的版本因为可能的冲突通过称为“绑定重定向”的机制自动解决了。绑定重定向如果有一件事对于了解这笔交易非常重要那就是绑定重定向。能够告诉运行时它将实际加载哪个版本而不管其引用的版本如何。这是一个示例您的流程有两个项目模块项目A和项目B。项目A引用log4net.dll v1.1项目B引用log4net.dll v1.2。两个log4net DLL文件都复制到输出文件夹但是只能有一个log4net.dll文件。假设复制到输出文件夹的文件是log4net.dll v1.2。假设到达的第一个代码是Project A中的代码该代码引用了log4net v1.1。运行时将在输出文件夹中查找找到不同版本的log4net并失败FileLoadException。还有另一种可能。假设首先执行了项目B中的代码并且在尝试使用log4net时它成功加载了log4net.dll v1.2。片刻之后Project A中的代码将尝试使用log4net v1.1请参见该程序集已经加载了其他版本并抛出FileLoadException。如果您知道哪个log4net版本将在输出文件夹中在这种情况下可以做的就是告诉运行时应该使用哪个版本。只需app.config在该runtime部分的文件中添加以下几行?xml version1.0 encodingutf-8 ? configuration...runtime...assemblyBinding xmlnsurn:schemas-microsoft-com:asm.v1dependentAssemblyassemblyIdentity namelog4net publicKeyToken669e0ddf0bb1aa2a cultureneutral /bindingRedirect oldVersion0.0.0.0-5.0.0.0 newVersion1.2.0 //dependentAssembly/assemblyBinding/runtime... /configuration 这意味着只要运行时想绑定到版本范围为0.0.0.0to的程序集log4net 5.0.0.0它就会尝试绑定到version 1.2.0。实际上您不必手动添加这些重定向因为它们是自动添加的。如果转到启动项目的“属性”则会看到以下设置图片-20200711101325128默认情况下选中此选项。它会自动检测版本冲突并在.config文件中生成绑定重定向。当问题开始发生时乍一看绑定重定向可能看起来像是对所有问题的答案但事实并非如此。使用绑定重定向时基本上使用的库版本与预期不同。如果删除方法怎么办或方法的签名已更改在这种情况下调用该方法时程序将因运行时错误而失败。毕竟创建版本是有原因的。如果确实存在此类问题则有解决方法。查看我的文章如何解决.NET引用和NuGet软件包版本冲突[4]。故障排除当您有一个FileLoadException或类似的东西时我建议做的第一件事是查看Visual Studio中的“模块”窗口。在这里您将看到所有已加载的模块并确定您要加载的程序集是否已加载使用哪个版本以及从哪个路径加载。除此之外您还可以查看程序集绑定日志也称为融合日志。这些日志将显示在程序集绑定尝试过程中到底发生了什么。您将看到运行时查找的程序集版本运行时查找的文件夹以及故障点。有几种查看融合日志的方法。首先您必须启用它们因为默认情况下它们是禁用的。您可以通过将HKLM\Software\Microsoft\Fusion\ForceLog值设置为1并将HKLM\Software\Microsoft\Fusion\LogPath值设置为来在注册表中手动启用它们C:\FusionLogs。日志将自动出现。或者您可以使用Fusion Log Viewer该软件应以方式安装在PC上fuslogvw.exe。我建议使用“一切窗口”搜索之[5]类的程序来查找它。确保以管理员权限运行融合日志查看器以便能够启用和禁用日志。最近更流行的一种更现代的工具是Fusion [6]。边注也许您不需要但是我以前讨厌不得不处理这类问题。例如一个逻辑上的问题让我构建一些东西甚至解决一个生产错误但其他问题都好说唯独这个……。在这件事上别无选择我不得不艰难地学习程序集绑定的内部工作。我发现就像其他所有内容一样一旦您理解了某些内容它就会变得不那么可怕甚至变得不再那么有趣了。因此我希望本文对您有意义并会在我走过的道路上为您提供快速帮助。References[1] Microsoft文档: https://docs.microsoft.com/en-us/dotnet/framework/deployment/how-the-runtime-locates-assemblies[2] 全局程序集缓存: https://docs.microsoft.com/en-us/dotnet/framework/app-domains/gac[3] gacutil.exe: https://docs.microsoft.com/en-us/dotnet/framework/tools/gacutil-exe-gac-tool[4] 如何解决.NET引用和NuGet软件包版本冲突: https://michaelscodingspot.com/how-to-resolve-net-reference-and-nuget-package-version-conflicts/[5] 一切窗口”搜索之: https://www.voidtools.com/[6] Fusion : https://github.com/awaescher/Fusion/
http://wiki.neutronadmin.com/news/61777/

相关文章:

  • 许昌小学网站建设网站模板超市
  • php网站外包网络科技有限公司取名四个字
  • 七星彩网投网站建设网络营销实施方案
  • 网站使用费用深圳属于哪个省
  • 如何注册网站怎么注册建设工程教育网好还是环球网站好
  • 做隐私的网站网站建设工期时间表
  • 自己做简历网站wordpress html伪静态
  • 潜江做网站网络营销名词解释汇总
  • 二级目录怎么做网站官网网站备案流程图
  • 企业网站建设价格商丘网站推广的方法
  • 成都科技网站建设电话多少内蒙古银税互动平台
  • 保险网站推荐公司画册
  • WordPress臃肿主题怎样做网站排名优化
  • 济南网站开发招聘外包做网站公司
  • 网站织梦温江建设网站
  • 网站手机端优化html演示网站
  • 淄博建企业网站如何起手做网站项目
  • 招工网站58同城wordpress添加new
  • 做外语网站中国网站模板下载
  • 网站后台用什么语言合适50个适合县城做的代理
  • 视频剪辑素材免费网站可以做代销的网站都有哪些
  • 用.net做购物网站甘肃网站备案审核
  • 网站开发的需要的技术人员wordpress修改数据库表
  • 方正网站制作东莞石龙网站建设定制
  • 为什么不建议学网络工程seo网站快速排名软件
  • 做网站找哪家公司好网站首页素材
  • 汽车4s店网站模板个人中心网页
  • 单页网站搭建域名注册解析管理网站
  • 深圳网站建设推广平台小程序商城的服务哪家好
  • jsp网站架构企业网网站怎么做