如何检测 DLL 是否已安装/可用

本文关键字:是否 安装 可用 DLL 何检测 检测 | 更新日期: 2023-09-27 17:56:16

检测 DLL 是否安装在 C# 中的最有效方法是什么?我对此很感兴趣:msvcr80.dll。我尝试从 C# 程序调用 LoadLibrary 互操作 API 调用,但它不起作用。我只需要检测它,而不是利用它。

如何检测 DLL 是否已安装/可用

pinvoking msvcr80.dll很困难。 它是一个特殊的DLL,它存储在Windows并行缓存(c:''windows''winsxs)中,并且通常在一台计算机上安装了许多版本。 我在这台机器上有 16 个。 并行缓存等效于非托管 DLL 的 GAC。 在代码中使用此类 DLL 需要一个清单,该清单说明要使用的特定版本的 msvcr80.dll。

因此,您要做的第一件事是将条目添加到您自己的程序清单中。 "项目 + 添加新项",选择"应用程序清单"项模板。 您必须对其进行编辑以包含对 msvcr80.dll 的依赖项。 您的清单应如下所示:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
            </requestedPrivileges>
        </security>
    </trustInfo>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
        </dependentAssembly>
    </dependency>
</asmv1:assembly>

请注意版本属性,8.0.50727.6195是最新版本。 其他常见的修订版是42(原始RTM版本)和762(SP1版本)以及大量安全更新。 通常可以在清单中使用 .42,更新部署的发布者策略文件将重定向到计算机上最新安装的版本。

另请注意 processorArchitecture 属性,如果要使用 64 位版本的 DLL,则需要"amd64"。 最好坚持使用 x86 并确保您的程序在 32 位模式下运行。 右键单击 EXE 项目、"属性"、"生成"选项卡、"平台目标 = x86"。

现在可以使用 [DllImport] 从 DLL 调用函数。 喜欢:

    [DllImport("msvcr80.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern IntPtr _errno();

我故意选择一个无辜的函数,它没有任何用处。 以便您可以精确调用它以测试是否安装了具有所需版本号的 DLL。 捕获异常以了解它不存在。 如果你想无一例外地做到这一点,那么pinvoc LoadLibrary()。

我猜你没有完全指望这些并发症。 一种完全不同的方法是使用 Windows 代码使用的等效 DLL。 只要您不尝试调用"异常"函数,这很好。 每个Windows安装都有msvcrt.dll,无需检查它是否存在,也不需要清单。 只需更改 [DllImport] 属性中的 DLL 名称即可。 但请注意,当Microsoft显着更改 CRT 的此私有副本时,您的程序有一天可能会中断。

您需要检查 PATH 环境变量下的目录和全局程序集缓存,最好使用此 API 完成。