3

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

4

2 回答 2

4

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 的私有副本时,您的程序可能会在某天中断。

于 2013-01-28T18:11:49.680 回答
1

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

于 2013-01-28T17:16:09.887 回答