加载和解析非托管库
ALC也能够加载和解析本地库,当你调用一个标有[DllImport]属性的外部方法时,会触发本地解析:
[DllImport("SomeNativeLibrary.dll")]
static extern int SomeNativeMethod (string text);
因为我们没有在[DllImport]属性中指定完整的路径,所以调用Some NativeMethod会在包含SomeNativeMethod定义的程序集的任何ALC中触发解析。
ALC中的虚拟(virtual)解析方法被称为LoadUnmanagedDll,而加载方法被称为LoadUnmanagedDllFromPath
protected override IntPtr LoadUnmanagedDll (string unmanagedDllName)
{
// Locate the full path of unmanagedDllName...
string fullPath = ...
return LoadUnmanagedDllFromPath (fullPath); // Load the DLL
}
如果无法定位该文件,可以返回IntPtr.Zero。然后CLR将触发ALC的ResolvingUnmanagedDll事件.
有趣的是,LoadUnmanagedDllFromPath方法是受保护的,所以通常不能从ResolvingUnmanagedDll事件处理器中调用它。然而,可以通过调用静态的NativeLibrary.Load来实现同样的结果。

文章详细介绍了.NET中的AssemblyLoadContext(ALC)如何加载和解析非托管库,以及处理DllImport的方法。ALC的LoadUnmanagedDll和LoadUnmanagedDllFromPath方法用于加载本地库,而AssemblyDependencyResolver帮助解决程序集和非托管库的依赖。当处理NuGet依赖和平台特定的库时,如Microsoft.Data.SqlClient,AssemblyDependencyResolver能解析deps.json文件找到正确路径。文章还讨论了可收集的ALC和卸载机制,以及卸载失败的潜在原因。
最低0.47元/天 解锁文章
3788

被折叠的 条评论
为什么被折叠?



