非托管库通过涉及不同阶段的算法进行定位和加载。
以下算法描述如何通过 PInvoke 加载本机库。
PInvoke 加载库算法
PInvoke 在尝试加载非托管程序集时使用以下算法:
确定
activeAssemblyLoadContext。 对于非托管加载库,activeAssemblyLoadContext 是具有定义PInvoke的程序集。对于
activeAssemblyLoadContext,尝试通过以下方式按优先级排序来查找程序集:检查其缓存。
调用由 System.Runtime.InteropServices.DllImportResolver 函数设置的当前 NativeLibrary.SetDllImportResolver(Assembly, DllImportResolver) 委托。
在
activeAssemblyLoadContext 中调用 AssemblyLoadContext.LoadUnmanagedDll 函数。引发 AssemblyLoadContext.ResolvingUnmanagedDll AssemblyLoadContext 的
active事件。