简体   繁体   中英

How to determine .NET CLR version on a non-Visual Studio machine

I've read various posts about determining the .NET Framework versions installed by checking registry entries. But I read in this article that different .NET Framework versions require different CLR versions on which to run. So I know, from the registry, that I have .NET Framework 4.8 installed on my Dev server. And I've run clrver.exe and determined that I have CLR version 4.0.30319 installed, which will only support up to .NET Framework v4.5.2. That's all on my Dev server. I want to konw the same information for my Test and Production servers. I can get the .NET Framework versions from the registry, but how can I determine the CLR version on a machine that doesn't have Visual Studio installed, since clrver.exe is a Visual Studio tool?

clrver.exe calls CLRCreateInstance

So you can do the same thing =>

I get :

Version: v2.0.50727

Version: v4.0.30319

object pCLRMetaHost;
HRESULT hr = CLRCreateInstance(CLSID_CLRMetaHost, typeof(ICLRMetaHost).GUID, out pCLRMetaHost);
if (hr == HRESULT.S_OK)
{
    ICLRMetaHost CLRMetaHost = (ICLRMetaHost)pCLRMetaHost;
    IEnumUnknown pEnumUnknown;
    hr = CLRMetaHost.EnumerateInstalledRuntimes(out pEnumUnknown);
    if (hr == HRESULT.S_OK)
    {
        object[] pUnknown = new object[1];
        uint uceltFetched;
        while (HRESULT.S_OK == pEnumUnknown.Next(1, pUnknown, out uceltFetched) && (uceltFetched == 1))
        {
            int nBufferSize = 256;
            StringBuilder sbBuffer = new StringBuilder(nBufferSize);
            ICLRRuntimeInfo CLRRuntimeInfo = (ICLRRuntimeInfo)pUnknown[0];
            CLRRuntimeInfo.GetVersionString(sbBuffer, ref nBufferSize);
            Console.WriteLine("Version: {0}", sbBuffer);
        }
    }
    Marshal.ReleaseComObject(pCLRMetaHost);
}

with declarations :

    public enum HRESULT : int
    {
        S_OK = 0,
        S_FALSE = 1,
        E_NOINTERFACE = unchecked((int)0x80004002),
        E_NOTIMPL = unchecked((int)0x80004001),
        E_FAIL = unchecked((int)0x80004005),
    }

    [ComImport]
    [Guid("D332DB9E-B9B3-4125-8207-A14884F53216")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface ICLRMetaHost
    {
        HRESULT GetRuntime(string pwzVersion, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out object ppRuntime) ;
        HRESULT GetVersionFromFile(string pwzFilePath, StringBuilder pwzBuffer, ref uint pcchBuffer);
        HRESULT EnumerateInstalledRuntimes(out IEnumUnknown ppEnumerator);
        HRESULT EnumerateLoadedRuntimes(IntPtr hndProcess, out IEnumUnknown ppEnumerator);
        HRESULT RequestRuntimeLoadedNotification(IntPtr pCallbackFunction);
        HRESULT QueryLegacyV2RuntimeBinding([In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out object ppUnk);
        HRESULT ExitProcess(int iExitCode);
    }

    [Guid("00000100-0000-0000-C000-000000000046")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IEnumUnknown
    {
        HRESULT Next([In, MarshalAs(UnmanagedType.U4)] uint celt, [Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.IUnknown, SizeParamIndex = 0)] object[] rgelt,
            [MarshalAs(UnmanagedType.U4)] out uint pceltFetched);
        HRESULT Skip(uint celt);
        HRESULT Reset();
        HRESULT Clone(out IEnumUnknown ppenum);
    }

    [Guid("BD39D1D2-BA2F-486a-89B0-B4B0CB466891")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface ICLRRuntimeInfo
    {
        HRESULT GetVersionString(StringBuilder pwzBuffer, ref int pcchBuffer);
        HRESULT GetRuntimeDirectory(StringBuilder pwzBuffer, ref int pcchBuffer);
        HRESULT IsLoaded(IntPtr hndProcess, out bool pbLoaded);
        HRESULT LoadErrorString(uint iResourceID, StringBuilder pwzBuffer, out int pcchBuffer, int iLocaleID);
        HRESULT LoadLibrary(string pwzDllName, out IntPtr phndModule);
        HRESULT GetProcAddress(string pszProcName, out IntPtr ppProc);
        HRESULT GetInterface([In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out object ppUnk);
        HRESULT IsLoadable(out bool pbLoadable);
        HRESULT SetDefaultStartupFlags(int dwStartupFlags, string pwzHostConfigFile);
        HRESULT GetDefaultStartupFlags(out int pdwStartupFlags, StringBuilder pwzHostConfigFile, ref int pcchHostConfigFile);
        HRESULT BindAsLegacyV2Runtime();
        HRESULT IsStarted(out bool pbStarted, out int pdwStartupFlags);
    }

    [DllImport("MSCorEE.dll", SetLastError = true)]
    public static extern HRESULT CLRCreateInstance([In, MarshalAs(UnmanagedType.LPStruct)] Guid clsid, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out object ppInterface);

    static Guid CLSID_CLRMetaHost = new Guid("{9280188d-0e8e-4867-b30c-7fa83884e8de}");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM