拦截.net app中的DateTime.Now

时间:2018-05-25 12:22:54

标签: c# .net datetime system-calls

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

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

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

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

我想知道的是:

是否可以拦截对框架的调用(在本例中为Datetime.Now)并返回特定值? 这可以来自相同的应用程序。不幸的是,我不确定你是否能以这种方式实际拦截这些调用,甚至可以识别调用进程。 我意识到你可以通过一些测试框架来实现这一点,但是它们将要求你在任何情况下都改变你的代码库。

感谢

3 个答案:

答案 0 :(得分:0)

一些谷歌搜索引导我进入软件RunAsDate by NirSoft。我不能认可这个软件,但我可以看到它声称它正是你所要求的。

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

答案 1 :(得分:0)

如果除了在运行时修补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属性getter,使其返回其原始值+ 100年。你可以明显改变它以返回你需要的任何值。

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

答案 2 :(得分:0)

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

高级别 - 在应用程序中添加了datetimeprovider函数,其函数采用字符串并返回datetime,而不是datetime.now。

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

如果未找到匹配项,则仅返回datetime.now

无论如何,如上所述,这并不理想,但在这种情况下比集成其他解决方案更容易。我也很欣赏我提到的在我们的解决方案范围之外可能没有意义的事情,所以请为此道歉。

但是不管感谢你的建议,它确实给了我一些关于我正在研究的其他问题的想法。