Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测DLL是否已安装/可用_C#_Dllimport - Fatal编程技术网

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

C# 如何检测DLL是否已安装/可用,c#,dllimport,C#,Dllimport,检测DLL是否安装在C#中最有效的方法是什么? 我对这个很感兴趣:msvcr80.dll。我试图从C程序调用LoadLibrary互操作API调用,但没有成功。我只需要检测它,而不是使用它。您需要检查路径环境变量下的目录,以及全局程序集缓存,最好使用它。Pinvoking msvcr80.dll很困难。它是一个特殊的DLL,它存储在Windows并行缓存(c:\Windows\winsxs)中,并且通常有许多版本安装在一台计算机上。这台机器上有16个。并行缓存相当于非托管DLL的GAC。在代码中

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

您需要检查
路径
环境变量下的目录,以及全局程序集缓存,最好使用它。

Pinvoking msvcr80.dll很困难。它是一个特殊的DLL,它存储在Windows并行缓存(c:\Windows\winsxs)中,并且通常有许多版本安装在一台计算机上。这台机器上有16个。并行缓存相当于非托管DLL的GAC。在代码中使用这样的DLL需要一个清单,其中说明要使用的msvcr80.DLL的特定版本

因此,您必须做的第一件事是将条目添加到您自己的程序清单中。Project+添加新项,选择应用程序清单项模板。您必须对其进行编辑,以包含对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>
我故意选择了一个没有任何用处的无辜函数。因此,您可以通过pinvoke测试是否安装了具有所需版本号的DLL。捕捉异常以知道它不存在。如果希望无例外地执行此操作,请使用pinvoke LoadLibrary()


我猜你没有完全指望这些并发症。另一种完全不同的方法是使用Windows代码使用的等效DLL。这是好的,只要你不尝试pinvoke“不寻常”的功能。每次安装Windows都有msvcrt.dll,不需要检查它的存在,也不需要清单。只需在[DllImport]属性中更改DLL名称。但请注意,当Microsoft对CRT的这个私有副本进行重大修改时,您可能会冒程序崩溃的风险。

您对“…安装在C#”是什么意思?您为什么需要知道?您试图解决的“真正”问题是什么?SQL Server CE 3.5 SP2依赖于此。我想检查安装程序中是否满足此要求。例如,VisualC++ 2008可重分发包将安装它,但在那里的许多其他包也会这样做。这就是为什么我不想在Visual C++ 2008上重新分配一个条件的原因。
    [DllImport("msvcr80.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern IntPtr _errno();