Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在拦截.net应用程序中的DateTime.Now_C#_.net_Datetime_System Calls - Fatal编程技术网

C# 正在拦截.net应用程序中的DateTime.Now

C# 正在拦截.net应用程序中的DateTime.Now,c#,.net,datetime,system-calls,C#,.net,Datetime,System Calls,我们有一个应用程序,它使用当前日期(使用Datetime.Now)来计算特定的值 我们还需要能够基于不同的日期在服务器上运行这些计算。 不幸的是,这两个明显的选择并不可行: a) 虽然我们有应用程序的代码,但由于政治和其他环境也使用该服务的事实,我们将无法更改它并注入特定的日期和时间 b) 由于服务器上运行其他应用程序和进程,我们无法更改系统日期 我想知道的是: 是否可以拦截对框架的调用(本例中为Datetime.Now)并返回特定值? 这可以来自同一应用程序,也可以不来自同一应用程序。不幸的是

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

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

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

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

我想知道的是:

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


谢谢

通过谷歌搜索我找到了这个软件。我不能认可这个软件,但我可以看到,它声称正是你所要求的


请让我们知道这是否适用于.NET应用程序

如果您除了在运行时修补
DateTime.Now
之外别无选择,您可以使用库来完成此操作。我当然不建议你做这样的事情,但你可以自己决定

首先下载二进制文件(还没有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
property getter,使其返回其原始值+100年。显然,您可以更改它以返回所需的任何值


此修补程序不影响任何其他进程,
DateTime。现在
将像往常一样为它们工作。

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

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

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

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

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


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

您不能使用一个标志专门为所述环境构建不同于其他环境的内容吗?这在技术上是可能的,需要一个IL重写器。我认为PostSharp可以做到这一点,但不完全确定。重构代码,以便只有一个方法返回DateTime。当然,现在是更符合逻辑的选择。适用于带有DateTime的.NET Framework 4.5。现在case=)