如何检测 DLL 是否已安装/可用
本文关键字:是否 安装 可用 DLL 何检测 检测 | 更新日期: 2023-09-27 17:56:16
检测 DLL 是否安装在 C# 中的最有效方法是什么?我对此很感兴趣:msvcr80.dll。我尝试从 C# 程序调用 LoadLibrary 互操作 API 调用,但它不起作用。我只需要检测它,而不是利用它。
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 完成。