了解程序集如何在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是此处的启动项目:
当您从另一个项目引用一个项目时,在构建时,被引用项目的DLL或EXE被复制到启动项目的Bin文件夹中。
通常是Bin \ Debug或Bin \ Release。在运行时,当您第一次使用引用的项目中的类型时,CLR在应用程序目录中查找具有与期望的名称和版本相同的DLL文件。然后将程序集加载到流程中。这也称为