【问题标题】:How can I know which Runtime Host is currently run my code?我如何知道哪个运行时主机当前正在运行我的代码?
【发布时间】:2013-06-07 01:44:08
【问题描述】:

正如 Microsoft 文档声明 Runtime Hosts 那样,.NET 有多个运行时主机来支持和执行我们的应用程序的代码,我的问题是如何知道 Microsoft 运行时主机的哪些运行时主机正在托管我的代码。

我正在使用 C# 语言开发 dll 类库,该类库可由各种运行时主机使用和/或托管,因此我需要知道哪个运行时主机现在托管我的代码以满足指定条件。

【问题讨论】:

  • 您是否暗示 DLL 运行时“共享”代码可能使用比调用它的代码更新版本的 .net 运行时?读/写 *.config 文件是您唯一关心的问题吗?

标签: .net clr clr-hosting


【解决方案1】:

实际上有一种非常简单的方法可以确定 CLR 的当前运行时版本。碰巧的是,如果您的代码由于 SxS(并排)执行而当前在不同的 CLR 中运行,Environment.Version 将返回不同的版本。

要了解它在可以同时具有两个运行时的应用程序中的实际工作原理,请查看this article on Demonstrating Side by Side execution

if(Environment.Version.StartsWith("2.0"))
    System.Console.WriteLine("Inside .NET CLR 2.0");
else if(Environment.Version.StartsWith("4.0"))
    System.Console.WriteLine("Inside .NET CLR 4.0");
else
    System.Console.WriteLine("Unknown .NET version");

请注意,.NET 2.0 加载器将加载 .NET 2.0 的最新 CLR,在大多数情况下为 .NET 3.5。在一个进程中并排运行不同版本的 .NET 2.0 是不可能的。 to run .NET 1.0 or .NET 1.1 side by side with .NET 2.0 in .NET 4.0 也不可能(尽管在 .NET 4.0 中并排运行 1.0 或 1.1 是可能的)。

【讨论】:

    【解决方案2】:

    .NET Framework 4 托管 API 提供 CLRCreateInstance 函数,该函数可以返回 ICLRMetaHost 接口。然后,您可以在此接口上调用 GetRuntime 方法来获取特定的 ICLRRuntimeInfo 接口,给定特定的 CLR 版本。此过程取代了 .NET Framework 2.0 托管 API 使用的 CorBindToRuntimeEx 方法。

    .NET Framework 2.0 版托管 API 提供 CorBindToRuntimeEx 函数来初始化运行时。您可以选择加载哪个版本的运行时,但一个进程只能承载一个版本。如果加载了 2.0、3.0 或 3.5 版本,则该函数返回 ICLRRuntimeHost 接口,该接口用于启动运行时并执行托管代码。

    来源: http://msdn.microsoft.com/en-us/library/dd380850.aspx

    【讨论】:

    • 如何调用这些函数,还有其他更简单的方法吗?
    • 在深入研究了 MSDN 和 google 之后,我发现 MSCorEE.dll 提供的接口不包含定义 CLR 的主机名或版本的方法,这些接口提供托管和管理功能仅限 CLR,您可以通过使用这些接口了解的一种信息是运行您的代码的 CLR 的版本,而不是运行 CLR 本身的主机
    • 顺便说一句,为什么您认为 CLR 会受益于知道其主机的名称或版本?,另外编写不同 CLR 主机的主要思想是控制 CLR 行为,我认为 CLR 应该是无论如何主机都不知道!
    • 你说得对,但是考虑一下你自己开发的 DLL 库需要处理配置文件,现在如果你的 dll 将托管在 ASP.NET 中,那么你需要通过 WebConfigurationManager 类来处理配置文件如果您的 dll 将托管在 Shell 命令提示符中,那么您需要通过 ConfigurationManager 处理配置文件,所以我的问题是如何确定何时必须使用这些类中的任何一个?
    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2014-02-06
    相关资源
    最近更新 更多