首页 > 其他分享 >为.Net项目添加动态库加载路径

为.Net项目添加动态库加载路径

时间:2024-10-30 14:58:30浏览次数:1  
标签:路径 添加 Net5 动态 Net 加载

为.Net项目添加动态库加载路径_51CTO博客_linux 动态库加载路径

本文分别基于.Net Framework和.Net Core的WPF应用程序为例,来说明如何为.Net项目添加自定义动态库加载路径。本文基于.Net Core创建WPF时,使用了.Net5作为目标框架。

1、.Net Framework

在基于.Net Framework的WPF项目中,直接在配置文件(App.config)中添加runtime节点即可。

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <!-- 指定加载程序集时公共语言运行时搜索的子目录, 
         其中privatePath是相对于*.exe.config文件的相对路径,
         多个文件夹以分号分隔。-->
    <probing privatePath="Libs\Lib1;Libs\Lib2"/>
  </assemblyBinding>
</runtime>

2、.Net5

在基于.Net5的WPF项目中,使用privatePath已经不能够实现指定文件夹程序集的加载了,这大概时因为在.Net5中,程序集的加载依赖于应用程序的.deps.json文件,而privatePath指定的文件夹中的程序集不会被添加到.deps.json文件中。

基于<probing privatePath="..." /> doesn't work in .Net 5.0 · Issue #45342 · dotnet/runtime · GitHub,在项目文件(配置文件中应该也可以)设置动态库加载路径,然后基于AssemblyLoadContext类的Resolving事件,在应用程序查找未知类型时加载配置文件中的动态库。

(1)在.csproj文件中设置动态库路径

<ItemGroup>
  <RuntimeHostConfigurationOption Include="SubdirectoriesToProbe" Value="Plugins" />
</ItemGroup>

(2)在代码中实现类型动态加载

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        //加载程序集事件
        AssemblyLoadContext.Default.Resolving += ResolveAssembly;

        base.OnStartup(e);
    }
    
    //加载指定位置程序集
    private static Assembly ResolveAssembly(AssemblyLoadContext assemblyLoadContext, AssemblyName assemblyName)
    {
        var probeSetting = AppContext.GetData("SubdirectoriesToProbe") as string;
        if (string.IsNullOrEmpty(probeSetting))
        {
            return null;
        }

        foreach (var subDirectory in probeSetting.Split(';'))
        {
            var pathMaybe = Path.Combine(AppContext.BaseDirectory, subDirectory, $"{assemblyName.Name}.dll");
            if (File.Exists(pathMaybe))
            {
                return assemblyLoadContext.LoadFromAssemblyPath(pathMaybe);
            }
        }

        return null;
    }
}

 

标签:路径,添加,Net5,动态,Net,加载
From: https://www.cnblogs.com/MarcLiu/p/18515859

相关文章

  • 使用asp.net mvc 过程中 参数传递的问题记录。
    环境:asp.netMVC需求:要实现主从表数据存储,主表为结构化信息,附表为对应的图片。实现过程:页面中当用户在新建数据的时候,未保存时没有主表的主键,同时用户也会选择要上传的图片一同保存。 使用ajaxfileupload.js实现多文件上传,上传之后通过window.URL.createObjectURL将上传......
  • .NET中的线程池ThreadPool(链接)
    微软推荐在.NET中使用多线程开发时,都使用线程池,下面这篇微软文档介绍了.NET中的线程池类ThreadPool:ThreadPoolClass注意上面文档中的这句话:Thereisonethreadpoolperprocess.也就是说,每个.NET进程(process)中有一个线程池,线程池在每个.NET进程中只有一个,一个.NET进程中......
  • 在K8S中,有一家拥有非常分散系统,拥有大量数据中心、虚拟机以及许多从事各种任务的员工
    对于一家拥有非常分散系统的跨国公司来说,使用Kubernetes(K8s)来管理其大量的数据中心、虚拟机以及相关的基础设施可以带来显著的好处。Kubernetes是一个用于自动化部署、扩展和管理容器化应用的开源平台,它可以帮助企业实现资源的一致管理和更高效的运营。以下是如何利用Kubernetes进......
  • .NET 8.0 开源在线考试系统(支持移动端)
    https://www.cnblogs.com/1312mn/p/18510576 阅读目录前言系统介绍系统功能支持环境系统源码项目部署项目效果项目总结项目地址最后前言推荐一款基于.NET8.0免费开源跨平台在线考试系统,系统不仅支持桌面端,还特别优化了移动端的用户体验。通过本系统可以轻松......
  • Install PNetLab v6 BETA release
    安装仿真网络模拟器PNetLabv6版本Installationinstructions-PNetLabv6BETAreleaseReadthefullinstructionsandimportantnotesbeforestartingtheprocess.Afteryoufinishreadingthem,followtheprocessstepbystep.Step1DownloadtheUbuntuServ......
  • ubuntu安装linux版本acunetix漏洞扫描软件
    为记事本里面没有保存的内容写一份文档,为了防止文件丢失,随手补写一份文档这篇文章主要讲在linux系统下如何安装acunetix1.安装前准备1.1.系统情况CPU:4vcpuRAM:8GRAMDisk:100GBSysOS:ubuntu22.04LTS1.2.安装必要的软件sudoapt-getupdatesudoapt-getinstall......
  • 【JVM第2课】类加载子系统(类加载器、双亲委派)
    类加载系统加载类时分为三个步骤,加载、链接、初始化,下面展开介绍。文章目录1类加载器1.1引导类加载器(BootStrapClassLoader)1.2拓展类加载器(`ExtClassLoader`)1.3应用类加载器(AppClassLoader)1.4双亲委派2链接2.1验证2.2准备2.3解析3初始化3.1定义3.2主要任......
  • Java语言的Netty框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统源码
    云快充协议+云快充1.5协议+云快充1.6+云快充协议开源代码+云快充底层协议+云快充桩直连+桩直连协议+充电桩协议+云快充源码介绍云快充协议+云快充1.5协议+云快充1.6+云快充协议开源代码+云快充底层协议+云快充桩直连+桩直连协议+充电桩协议+云快充源码软件架构1、提供云快......
  • MobileNetv2网络详解
    背景:MobileNetv1中DW卷积在训练完之后部分卷积核会废掉,大部分参数为“0”MobileNetv2网络是由Google团队在2018年提出的,相比于MobileNetv1网络,准确率更高,模型更小网络亮点:InvertedResiduals(倒残差结构)LinearBottlenecks倒残差结构:ResidualBlock:ResNet网络中提出......
  • 【前端】在 Next.js 中添加对 API 的监控和日志记录
    API的监控和日志记录对于维护系统的稳定性和性能至关重要。良好的监控和日志记录可以帮助您及时发现和解决问题。以下是一些常用的监控和日志记录实践和技术:1.日志记录使用框架内置的日志功能Next.js本身提供了基本的日志记录功能,但您可能需要更详细的日志来调试问题......