检测 C# 中是否安装了 DLL 的最有效方法是什么?我对这个很感兴趣:msvcr80.dll。我尝试从 C# 程序调用 LoadLibrary 互操作 API 调用,但它不起作用。我只需要检测它,而不是利用它。
2 回答
Pinvoking msvcr80.dll 很困难。它是一个特殊的 DLL,它存储在 Windows 并行缓存 (c:\windows\winsxs) 中,并且通常在一台机器上安装了许多版本。我在这台机器上有 16 个。并行缓存相当于非托管 DLL 的 GAC。在您的代码中使用这样的 DLL 需要一个清单,说明您要使用哪个特定版本的 msvcr80.dll。
因此,您要做的第一件事就是将该条目添加到您自己的程序清单中。Project + Add New Item,选择Application Manifest项模板。您必须对其进行编辑以包含对 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。捕获异常以知道它不存在。如果您想毫无例外地执行此操作,请调用 LoadLibrary()。
我猜你并没有完全指望这些并发症。一种完全不同的方法是使用 Windows 代码使用的等效 DLL。只要您不尝试调用“不寻常”的功能,这很好。每次安装 Windows 都有 msvcrt.dll,不需要检查它的存在,也不需要清单。只需更改 [DllImport] 属性中的 DLL 名称即可。但请注意,当 Microsoft 显着更改此 CRT 的私有副本时,您的程序可能会在某天中断。
您需要检查PATH
环境变量下的目录和全局程序集缓存,最好使用此 API完成。