【问题标题】:Intercepting DateTime.Now in .net app在 .net 应用程序中拦截 DateTime.Now
【发布时间】:2018-05-25 12:22:53
【问题描述】:

我们有一个使用当前日期(使用 Datetime.Now)来计算特定值的应用程序。

我们还需要能够根据不同的日期在服务器上运行这些计算。 不幸的是,这两个明显的选择是不可行的 -

a) 虽然我们有应用程序的代码,但由于政治原因以及其他环境也使用该服务的事实,将无法更改它并注入特定日期和

b) 由于服务器上运行的其他应用程序和进程,我们无法更改系统日期。

我想知道的是:

是否可以拦截对框架的调用(在本例中为 Datetime.Now)并返回特定值? 这可以来自相同的应用程序,也可以不同。不幸的是,我不确定您是否真的可以通过这种方式拦截这些调用,甚至能够识别调用进程。 我意识到你可以使用一些测试框架来做到这一点,但无论如何它们都需要你改变你的代码库。

谢谢

【问题讨论】:

  • 你不能使用一个标志来专门为不同于其他环境的环境构建吗?
  • 技术上可行,需要 IL 重写器。我认为 PostSharp 可以做到这一点,但并不完全确定。重构代码以便只有一个方法返回 DateTime。当然,Now 是更合乎逻辑的选择。

标签: c# .net datetime system-calls


【解决方案1】:

如果您除了在运行时修补 DateTime.Now 之外别无他法 - 您可以使用 Harmony 库来执行此操作。我显然不建议这样做,但你可以自己决定。

首先下载二进制here(还没有nuget包)。引用它然后:

class Program {
    static void Main(string[] args) {
        var now = DateTime.Now; // normal now
        var harmony = HarmonyInstance.Create("test");
        // patch
        harmony.PatchAll(Assembly.GetExecutingAssembly());
        // now + 100 years
        var newNow = DateTime.Now;
    }

    // we are rewriting method get_Now, which is a getter of property Now
    // of type DateTime
    [HarmonyPatch(typeof(DateTime), "get_Now")]
    class Patch {
        // this method runs after original one
        // __result stores value produced by original
        static DateTime Postfix(DateTime __result) {
            // add 100 years to it
            return __result.AddYears(100);
        }
    }
}

这将在运行时更改 DateTime.Now 属性获取器,使其返回其原始值 + 100 年。您显然可以更改它以返回您需要的任何值。

此补丁不会影响任何其他进程,DateTime.Now 将照常工作。

【讨论】:

    【解决方案2】:

    通过谷歌搜索,我找到了软件 RunAsDate by NirSoft。我不能认可这个软件,但我可以看到它声称完全符合您的要求。

    如果这适用于 .NET 应用程序,请告诉我们!

    【讨论】:

    • 适用于.NET Framework 4.5 with Datetime.now case =)
    【解决方案3】:

    真的认为在 .net 中这样做会更容易,但最后我决定更改代码。 虽然这种变化并不理想,但它不会带来任何我能想到的问题。

    高级 - 向应用程序添加了一个 datetimeprovider 函数,该函数接受一个字符串并返回 datetime,它被调用而不是 datetime.now。

    在那里,它将检查是否存在包含一个或多个环境名称/连接字符串对的配置文件。 使用已经收到的参数,它将传入请求与环境匹配,如果匹配,则连接到有问题的数据库并获取要使用的日期(QA 环境将其日期保存在表中,因为它们可以跳转到任何日期)

    如果没有找到匹配,它只会返回 datetime.now

    无论如何,如上所述,这并不理想,但在这种情况下,imo 比集成提到的其他解决方案更容易。我也很感激我提到的内容在我们的解决方案范围之外可能没有意义,因此对此表示歉意。

    但无论如何感谢您的建议,它确实为我正在研究的其他问题提供了一些想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 2010-11-16
      • 1970-01-01
      • 2018-08-28
      相关资源
      最近更新 更多