首页 > 编程语言 >.net程序找不到DLL最有效方式?

.net程序找不到DLL最有效方式?

时间:2024-09-01 17:26:47浏览次数:4  
标签:paths string List 路径 程序 DLL net 加载

原理:当程序启动加载程序集找不到时,会触发OnAssemblyResolve事件,再递归判断dll文件是否存在,如果存在则返回加载后的Assembly。 不用注册全局程序集,也不用强签名,非常有效。

public App()
{
    LoadEnvPaths();//对引用C++有效
    AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;
}
//-------------------------------------------------------------------------
/// <summary>
/// 事件处理加载平台程序集(.net程序集路径)
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
/// <returns></returns>
private static Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{
    // 获取要加载的程序集的名称
    string assemblyName = new AssemblyName(args.Name).Name;
    if (assemblyName.Contains(".resources")) return null;
    // 从环境变量或配置文件中获取程序集路径
    //一般程序集只安排在以下两个文件夹
    List<string> paths = GetEnvPaths();
    foreach ( string path in paths )
    {
        // 组合程序集的完整路径
        string fullPath = System.IO.Path.Combine( path , assemblyName + ".dll" );
        if (File.Exists(fullPath))
        {
            // 从指定路径加载程序集
            return Assembly.LoadFrom( fullPath );
        }
    }
    // 返回 null 以表示加载失败
    return null;
}
//-------------------------------------------------------------------------
/// <summary>
/// 获取环境路径
/// </summary>
/// <returns></returns>
public static List<string> GetEnvPaths()
{
    List<string> paths = new List<string>();
    paths.AddRange(GetPaths(@"J:\Gui"       ));
    paths.AddRange(GetPaths(@"J:\Library"   ));
    return paths;
}
//-------------------------------------------------------------------------
/// <summary>
/// 设置MT平台环境路径(C++类库路径)
/// </summary>
public static void LoadEnvPaths()
{
    var path = new[] { Environment.GetEnvironmentVariable("PATH") ?? string.Empty };
    List<string> paths = GetEnvPaths();
    string newPath = string.Join(System.IO.Path.PathSeparator.ToString(), path.Concat( paths ));
    Environment.SetEnvironmentVariable("PATH", newPath);
}
//-------------------------------------------------------------------------
/// <summary>
/// 获取指定目录下所有可能子目录
/// </summary>
/// <param name="rootPath">[输入] 指定目录</param>
/// <returns></returns>
static List<string> GetPaths( string rootPath )
{
    List<string> directories = new List<string>();
    directories.Add(rootPath);// 添加当前目录的路径 
    try
    {
        // 获取当前目录下的所有子目录
        string[] subdirectories = Directory.GetDirectories(rootPath);
        foreach (string subdirectory in subdirectories)
        {                          
            directories.AddRange( GetPaths( subdirectory ) );// 递归调用获取子目录的路径
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error accessing {rootPath}: {ex.Message}");
    }
    return directories;
}

 

标签:paths,string,List,路径,程序,DLL,net,加载
From: https://www.cnblogs.com/jk-autotech/p/18391468

相关文章

  • CLR/C++程序找不到DLL最有效方法?
     使用C++17及以上,支持filesystem处理不需要程序集强签名,也不用注册全局程序集缓存,非常有效。#include<iostream>#include<filesystem>usingnamespacestd::filesystem;namespacefs=std::filesystem;//-----------------------------------------------------......
  • 【运维系列】如何为Telnet开放安全策略
    常见的管理协议,如Telnet、SSH、FTP,具有相似的业务模型。先看Telnet。如图1-1所示,网络中可能有三种业务访问关系。【入方向(Inbound)流量】:从管理终端Telnet防火墙的接口地址,是访问防火墙的流量。【出方向(Outbound)流量】:从防火墙Telnet服务器的地址,属于从防火墙发出的流量。【穿墙......
  • 【运维系列】如何为NETCONF开放安全策略
    NETCONF(NetworkConfigurationProtocol,网络配置协议)是一种基于XML的网络管理协议,它提供了一种对网络设备进行配置和管理的可编程方法。NETCONF协议的传输层可以是BEEP、SSH、TLS或SOAP。由于RFC协议规定必须支持SSH,所以目前SSH是NETCONF使用最广泛的传输层协议,当前华为防火墙产......
  • 微信小程序的图书借阅借书驿站系统 05211
    博主介绍......
  • 基于微信小程序的古代天文知识科普系统设计与实现 120b0
    博主介绍......
  • 微信小程序的四六级网上报名系统的设计与实现 k54bj
    技术栈支持以下技术栈开发运行:微信开发者/hbuilderx前端开发框架:vue.js数据库mysql版本不限后端语言框架支持:1java(SSM/springboot)-idea/eclipse2.Nodejs+Vue.js-vscode3.python(flask/django)–pycharm/vscode4.php(thinkphp/laravel)-hbuilderx数据库工具......
  • Steamui.dll守护指南:Steam客户端遭遇迷失时的自助恢复之旅
    Steamui.dll丢失应该如何处理?很多朋友还不是特别的清楚,解决Steamui.dll丢失的问题,可以按照以下步骤操作:1.重新安装Steam客户端:最直接的方法是卸载当前的Steam客户端,然后从官方网站重新下载安装包进行安装。这会自动替换所有丢失或损坏的文件,包括Steamui.dll。2.文件恢复:若......
  • OpenGL32.dll错误:无法找到入口点的速效修复秘籍及故障全面排查策略
    遇到OpenGL32.dll错误,通常意味着系统中的OpenGL库文件可能损坏或不兼容,这里提供一些解决方案来帮助您修复这个问题:1.更新图形驱动程序:•访问您的显卡制造商官网(例如NVIDIA、AMD或Intel),下载并安装最新的图形驱动程序。正确的驱动程序能够确保OpenGL组件正常工作。2.系统文件......
  • wxmsw311u_qa_vc_custom.dll加载故障:快速修复应用程序核心问题的实战手册
    wxmsw311u_qa_vc_custom.dll加载故障应该如何解决?要想解决wxmsw311u_qa_vc_custom.dll加载故障的问题,可以按照以下步骤尝试修复:1.重新安装相关软件:此dll文件属于某些Windows应用的组件,首先尝试卸载并重新安装可能导致问题的软件。这通常能自动替换损坏或丢失的dll文件。2.......
  • 【Internet Protocol】ip介绍,如何组局域网实现远程桌面和文件共享
    @目录1.何为“上网”1.1定义1.2为什么连了WiFi就能上网了?2.ip2.1什么是ip2.2为什么区分广域网和局域网,ip的唯一性2.3如何查看设备的ip2.4什么叫"ping"2.5区分是否两个ip是否在同一局域网2.5.1最稳妥的方式:ip&mask2.5.2最方便的方式:ping2.6ipv4与ipv6的区别3.远程桌面控......