为.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;
    }
}

 

posted @ 2024-10-30 15:08 六镇2012 阅读(9) 评论(0) 推荐(0) 编辑
摘要: 今天使用VS突然搜索功能失效,部分关键字明明有但是搜索不出来,度娘告诉我要这么做 转自vs2022查询搜索功能失效_2022vs搜索不到关键词-CSDN博客 删除“C:\Program Files\Microsoft Visual Studio\2022[Enterprise/Pro/Communi 阅读全文
posted @ 2024-06-19 15:34 六镇2012 阅读(99) 评论(0) 推荐(0) 编辑
摘要: 今天开发需要自己创建git远程分支,突然发现还没自己维护过远程分支,特意搜索了一下,做此纪录。 使用Tortoise 创建远程分支_tortoisegit 建立远程分支-CSDN博客 简述步骤: 1、创建本地分支,取好分支名称。 2、推送本地分支,远程分支置空,Git会根据分支名称自动创建远程分支。 阅读全文
posted @ 2024-06-19 13:55 六镇2012 阅读(111) 评论(0) 推荐(0) 编辑
摘要: 解决WPF下popup不随着window一起移动的问题_小戴BOTAOY演示博客 (yii666.com) /// <summary> /// Popup帮助类,解决Popup设置StayOpen="True"时,移动窗体或者改变窗体大小时,Popup不随窗体移动的问题 /// </summary> 阅读全文
posted @ 2024-03-04 16:57 六镇2012 阅读(95) 评论(0) 推荐(0) 编辑
摘要: WPF中CompositeCollection的使用_wpf compositecollection-CSDN博客 注意一点CollectionContainer在绑定vm时,不能直接绑定vm中的对象,需要通过Resources中转,参考以下代码 <MenuItem Width="200" Heig 阅读全文
posted @ 2024-02-27 16:57 六镇2012 阅读(110) 评论(0) 推荐(0) 编辑
摘要: 参考使用Navicat打开加密SQLite数据库_加密的数据库文件怎么打开-CSDN博客 1.在Nuget搜索并安装SQLitePCLRaw.bundle_e_sqlcipher 2.打开项目所在路径,按照下面的路径找到e_sqlcipher.dll文件(根据安装的Navicat版本选择win-x6 阅读全文
posted @ 2024-02-27 16:48 六镇2012 阅读(1285) 评论(0) 推荐(0) 编辑
摘要: 首先?相关语法,包括?. ?? ?: ? 1.可空类型修饰符(?) 众所周知,在C#中引用类型可以使用一个null引用来表示一个不存在的值,比如 string str = null 是正确的;但是值类型却不能为空,比如 int k = null 那么编译器就会报错;为了让值类型也可以为空,就需要使用 阅读全文
posted @ 2024-02-01 10:25 六镇2012 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 在阅读代码时碰到以下语法 var type = topic["DevModel/Query/".Length..]; 其中topic为string,主要疑惑Lenght后面的.. 查找资料发现为8.0新语法,主要新增了两种语法:..和^,官方解释如下 使用索引和范围探索数据范围 - C# | Mic 阅读全文
posted @ 2024-01-31 18:13 六镇2012 阅读(17) 评论(0) 推荐(0) 编辑
摘要: 质数定义法:质数是指只能被1和自身整除的正整数,即除了1和它本身以外没有其他因数。因此,判断一个数是否为质数,只需要将它分别除以2到它的平方根的整数,如果都不能整除,则它就是质数。这种方法比较简单直观,但对于较大的数会比较耗时。 1 static bool IsPrime(int num) 2 { 阅读全文
posted @ 2024-01-17 18:32 六镇2012 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 中文乱码一般都是编码方式问题,转成UTF-8格式即可 public static string DecFileName(string str) { Encoding utf8 = Encoding.GetEncoding("iso-8859-1"); byte[] btArr = utf8.GetB 阅读全文
posted @ 2023-11-10 17:39 六镇2012 阅读(1548) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示