首页 > 编程语言 >C++动态库封装C#库,验证动态库环境

C++动态库封装C#库,验证动态库环境

时间:2024-11-13 10:00:23浏览次数:1  
标签:string C# List C++ dll 动态 DLL

windows 平台、VS2019、x64

当C++编译的动态库提供给C#的开发人员时,需要实现一个C#的库使用委托去调用C++动态库。

当C#开发人员链接使用C#的动态库时,如果没有完全拷贝C++动态库所依赖的其他动态库时,就会出现运行报错。

但是报错时,不会提示缺少了什么库,这里在C#的中增加一个函数,去检测环境下缺少了什么动态库,便于排查问题。

实现

public class DynamicLibraryDetector
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    private static extern uint GetDllDirectory(uint nBufferLength, System.Text.StringBuilder lpBuffer);

    private static readonly List<string> RequiredDlls = new List<string>
    {
        "yourLibrary1.dll",
        "yourLibrary2.dll",
        "yourLibrary3.dll",
        // 添加所有依赖的 DLL 名称
    };

    /// <summary>
    /// Checks the existence of all required DLLs in the current working directory, DLL directory, and PATH environment variable.
    /// Throws a DllNotFoundException if any required DLL is missing.
    /// </summary>
    /// <exception cref="DllNotFoundException">
    /// Thrown if one or more required DLLs are not found.
    /// </exception>
    public static void Check()
    {
        List<string> missingDlls = new List<string>();
        List<string> foundDlls = new List<string>();

        // 获取当前 DLL 目录
        string currentDllDirectory = GetCurrentDllDirectory();

        foreach (var dll in RequiredDlls)
        {
            // 检查当前工作目录
            if (File.Exists(dll))
            {
                foundDlls.Add(dll);
                continue;
            }

            // 检查当前 DLL 目录
            string fullPathInCurrentDir = Path.Combine(currentDllDirectory, dll);
            if (File.Exists(fullPathInCurrentDir))
            {
                foundDlls.Add(dll);
                continue;
            }

            // 检查 PATH 环境变量中的所有路径
            string[] paths = Environment.GetEnvironmentVariable("PATH").Split(';');
            bool foundInPath = false;

            foreach (var path in paths)
            {
                string fullPath = Path.Combine(path, dll);
                if (File.Exists(fullPath))
                {
                    foundInPath = true;
                    foundDlls.Add(dll);
                    break;
                }
            }

            if (!foundInPath)
            {
                missingDlls.Add(dll);
            }
        }

        if (missingDlls.Count > 0)
        {
            throw new DllNotFoundException($"Missing DLL files: {string.Join(", ", missingDlls)}. Please make sure to copy them to the application directory or set the correct path in PATH. ");
        }
    }

    private static string GetCurrentDllDirectory()
    {
        const int bufferSize = 1024;
        var buffer = new System.Text.StringBuilder(bufferSize);
        GetDllDirectory((uint)bufferSize, buffer);
        return buffer.ToString();
    }
}

使用

DynamicLibraryDetector.Check();

标签:string,C#,List,C++,dll,动态,DLL
From: https://www.cnblogs.com/Yzi321/p/18543237

相关文章

  • 【VMware VCF】通过备份的配置文件还原 SDDC Manager 组件。
    之前在这篇文章(使用SFTP服务器备份VCF核心组件的配置文件。)中配置并备份了VCF环境中SDDCManager组件的配置文件,这篇文章接着这个主题,看看当SDDCManager组件因意外发生故障时,如何通过备份的配置文件进行还原和恢复。 一、检查SDDCManager执行还原之前,请确保SD......
  • PCB板材和适用场合
    本文主要叙述目前主要的PCB板材及其特点以及不同板材的应用场合。PCB的板材主要有FR-4玻璃纤维板、高TG玻璃纤维板、铝基板、高频板、柔性PCB(FPC软板)、陶瓷基板、碳化硅材料基板、聚四氟乙烯材料基板、特殊合金等。一、常用板材1、FR-4玻璃纤维板特点:FR-4是最常见的PCB基板......
  • PCB板厚选择指导
    本文主要叙述选择PCB板厚时可以考虑的因素以及常见PCB板厚。一、考虑因素1.电气性能PCB板的厚度直接影响其导电层的横截面积,从而影响电流的传输能力。较厚的PCB板具有更大的导电横截面积,能够承受更高的电流,降低线路阻抗,减少信号传输损耗。此外,较厚的PCB板在高频应用中有助......
  • 无插件H5播放器EasyPlayer.js网页web无插件播放器vue和react详细介绍
    EasyPlayer.jsH5播放器,是一款能够同时支持HTTP、HTTP-FLV、HLS(m3u8)、WS、WEBRTC、FMP4视频直播与视频点播等多种协议,支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式,支持MSE、WASM、WebCodec等多种解码方式支持Windows、Linux、Android、iOS全平台终端的H5播放器,使用简单......
  • 开发一个CRM系统难吗?CRM系统的实现步骤
    越来越多企业意识到了,客户关系管理(CRM)系统已成为企业提升客户体验、推动销售增长的必备工具。一个高效的CRM系统不仅能够帮助企业优化客户数据管理,还能提升客户满意度,增强客户忠诚度,从而推动业务的持续发展。然而,实施CRM系统并非简单的任务,它涉及多个阶段和细节,需要企业在各个环节......
  • socket
    京东数科二面:常见的IO模型有哪些?Java中的BIO、NIO、AIO有啥区别?I/O模型Unix有五种I/O模型:阻塞式I/O非阻塞式I/OI/O复用(select和poll)信号驱动式I/O(SIGIO)异步I/O(AIO)五大I/O模型比较一个输入操作通常包括两个阶段:等待数据准备好从内核向进程复制数据对于......
  • PyTorch 应用实战
    PyTorch作为深度学习非常重要的框架之一,在科研和开发领域有着非常广泛的使用,是我们学习和研究LLM必备的工具之一。本文主要介绍三个PyTorch的实战案例,方便大家快速了解和体验PyTorch。一、PyTorch简介PyTorch是一个开源的Python深度学习框架,它具有灵活、高效、易于学......
  • 适用于 Mac 和 Windows 的顶级U 盘数据恢复软件
    由于意外删除或设备故障而丢失USB驱动器中的数据始终是一件令人压力很大的事情,检索该信息的最佳选择是使用优质数据恢复软件。为了让事情变得更容易,我们已经为您完成了所有研究并测试了工具,并且我们列出了最好的USB记忆棒恢复软件,这将使您有最大的机会挽救丢失的文件。顶......
  • 【菜笔cf刷题日常-1600】C. Good Subarrays(思维,前缀和)
    链接:Problem-1398C-Codeforces思路:考虑每一个新加入的数对于原有序列(长度、数的总和)需求的变化:如1的加入对于原有序列需求无变化;2 的加入需要原有序列长度增加1;0 的加入需要原有序列数的总和增加1;……因此,将每个数减1(如1变为0,0变为 -1)来代表这个数的......
  • SpringBoot 处理 CORS 跨域请求的三种方法
    原文链接:SpringBoot处理CORS跨域请求的三种方法–每天进步一点点 0.前言pringboot跨域问题,是当前主流web开发人员都绕不开的难题。但我们首先要明确以下几点跨域只存在于浏览器端,不存在于安卓/ios/Node.js/python/java等其它环境跨域请求能发出去,服务端能收到请求并......