各位大虾们,本人想写个C++的程序可以检测出本地机器能否安装.net以及版本能否在2.0以上,本人初步的目标是这样的:用一个C++的程序调用一个C#的控制台程序,控制台返回一个特定的数值或字符串,假如返回成功则说明C#在本机可以运行。
问一下代码本人该怎么写呢?有什么API可以用吗?
问一下代码本人该怎么写呢?有什么API可以用吗?
解决方案:40分
用这个函数吧,要是能运行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;
}