C#插件式开发——非托管库加载和解析,以及AssemblyDependencyResolver解析

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

加载和解析非托管库

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来实现同样的结果。


                
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值