列出代码中 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 的版本 [重复]的主要内容,如果未能解决你的问题,请参考以下文章