列出代码中 msvcrXXX.dll 的版本 [重复]

Posted

技术标签:

【中文标题】列出代码中 msvcrXXX.dll 的版本 [重复]【英文标题】:List versions of msvcrXXX.dll in code [duplicate] 【发布时间】:2014-08-26 02:00:40 【问题描述】:

我想从 MS Visual Studio C 运行时 dll 中导入一个函数,以便使用 P/Invoke 从 C# 调用它。但是,为了稳健性,我不想在我的 DllImport 属性中硬编码运行时库的版本。

如何列出当前进程加载的msvcrXXX.dll的版本,最好使用C#代码?

而且,一旦我有了名称列表,如何在运行时加载给定 dll 名称的特定函数?

【问题讨论】:

你追求哪个功能? 【参考方案1】:

您可以使用以下 Win32 API: EnumProcessModules:获取当前进程中的所有模块 GetModuleBaseName:获取模块basename,并判断是否匹配mscrtxxxx.dll GetProcAddress:获取mscrtxxx.dll中的函数指针

这是给你的示例代码,

HANDLE hProcess = GetCurrentProcess();
DWORD numBytesRequried = 0;
if(!EnumProcessModules(hProcess, NULL, 0, &numBytesRequried))
    return -1;

HMODULE* phModules = new HMODULE[numBytesRequried/sizeof(HMODULE)];
if (!EnumProcessModules(hProcess, phModules, numBytesRequried, &numBytesRequried))

    delete [] phModules;
    return -1;


int mscrtver = -1;
MODULEINFO mscrtModuleInfo;
HMODULE hModuleMSVCRT = NULL;
TCHAR szModuleBaseName[MAX_PATH];
for(int i=0;i<numBytesRequried/sizeof(HMODULE);i++)

    if (GetModuleBaseName(hProcess, phModules[i], szModuleBaseName, _countof(szModuleBaseName)) == 0)
        continue;

    _tcsupr_s(szModuleBaseName, MAX_PATH);
    TCHAR* szFileName = _tcsrchr(szModuleBaseName, _T('\\'));
    if (szFileName != NULL)
        szFileName++;
    else
        szFileName = szModuleBaseName;

#ifdef _DEBUG
    if (_stscanf_s(szFileName, _T("MSVCR%dd.dll"), &mscrtver) == 1)
#else
    if (_stscanf_s(szFileName, _T("MSVCR%d.dll"), &mscrtver) == 1)
#endif
    
        hModuleMSVCRT = phModules[i];
        break;
    


delete [] phModules;
phModules = NULL;

if (mscrtver < 0 || hModuleMSVCRT == NULL)
    return -1;

printf("MSCRT VER: %d.%d\r\n", mscrtver/10, mscrtver%10);

typedef size_t (*funcptr_strlen)(const char*);
funcptr_strlen funcptr_test = (funcptr_strlen)GetProcAddress(hModuleMSVCRT, "strlen");

if (funcptr_test != NULL) 

    int test_ret = funcptr_test("abc");
    printf("test ret: %d.\r\n", test_ret);

这是我 PC 中的运行输出: MSCRT 版本:11.0 测试 ret: 3.

【讨论】:

Process.Modules 和 Linq 的一部分使这项任务成为 C# 单行代码 Process.Modules 是我最终使用的。 如果是这样,如何在 C# 中在运行时加载给定 dll 名称的特定函数?

以上是关于列出代码中 msvcrXXX.dll 的版本 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在没有 SSL 的情况下将 https 重定向到 http - IIS 7

我需要用 php - mysql 列出产品的唯一最新版本

kali卸载mysql以及重装mysql

如何找到 301/302 重定向源?

apt如何列出所有已经安装的软件包

重命名应用程序后,Core Data 出现问题?