各位大虾们,我想写个C++的程序可以检测出本地机器是否安装.net以及版本是否在2.0以上,我初步的目标是这样的:用一个C++的程序调用一个C#的控制台程序,控制台返回一个特定的数值或者字符串,如果返回成功则说明C#在本机可以运行。
请问代码我该怎么写呢?有什么API可以用吗?
------解决思路----------------------

用这个函数吧,要是能运行C#的方法说明有安装,
extern "C" BOOL __stdcall CallManaged(PCWSTR pszVersion, PCWSTR pszAssemblyPath, PCWSTR pszClassName, PCWSTR pszMethodName, PCWSTR argument)
{
ICLRMetaHost *pMetaHost = nullptr;
ICLRMetaHostPolicy *pMetaHostPolicy = nullptr;
ICLRRuntimeHost *pRuntimeHost = nullptr;
ICLRRuntimeInfo *pRuntimeInfo = nullptr;
HRESULT hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost);
hr = pMetaHost->GetRuntime(pszVersion, IID_PPV_ARGS(&pRuntimeInfo));
if (FAILED(hr))
{
goto cleanup;
}
hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_PPV_ARGS(&pRuntimeHost));
hr = pRuntimeHost->Start();
DWORD dwRet = 0;
hr = pRuntimeHost->ExecuteInDefaultAppDomain(pszAssemblyPath,
pszClassName,
pszMethodName,
argument,
&dwRet);
//hr = pRuntimeHost->Stop();
cleanup:
if (pRuntimeInfo != nullptr)
{
pRuntimeInfo->Release();
pRuntimeInfo = nullptr;
}
if (pRuntimeHost != nullptr)
{
pRuntimeHost->Release();
pRuntimeHost = nullptr;
}
if (pMetaHost != nullptr)
{
pMetaHost->Release();
pMetaHost = nullptr;
}
return 1;
}
第一个参数NET版本,第二个就是C#的DLL路径,第三个就是这个DLL下的某个类,第四个就是这个类的静太方法,第五个就是参数了。
RunManaged(L"v4.0.30319", hookDLLPath, L"NetHook.InjectionLoader", L"ExecuteAssembly", pc);
public static int ExecuteAssembly(string pwzArgument)
{
return 1;
}