C# 检测在运行时第二次运行应用程序期间更改了哪些 C# (.cs / poco) 文件



我想检测与上次运行相比,第二次运行应用程序时哪些 C# 文件 (pocos) 发生了更改。通过更改,我的意思是对文件的任何更改,例如更改方法中的逻辑或添加/删除属性/字段。您可以假定文件名保持不变。检查 git 日志/更改超出了此问题的范围。

我能想到的潜在解决方案是在数据库中保留哈希记录。我可以计算文件的哈希值或计算 poco 对象实例的哈希值。计算文件的哈希会给我一个唯一的哈希,但在运行时,所有.cs文件都被编译成 dll,因此可能无法在单个项目中执行此操作,我需要在主项目之前运行一个单独的项目来填充哈希(不理想)。或者我可以对对象实例进行哈希处理,但我认为这不会考虑 poco 方法/函数中的代码更改,因为它只是对属性/字段值进行哈希处理(如果我错了,请在此处更正我)。

我想知道是否有一种直接的方法可以做到这一点?这可能是一个解决方案,我可以在运行时获取文件的唯一哈希,将其保存到数据库以供第二次运行。在第二次运行时,将我刚刚生成的新哈希值与数据库中的值进行比较,并对所做的任何更改进行操作。

所以在这一点上,我不确定有什么可能的方法可以解决这个问题。关于如何解决这个问题的任何指示或建议都会有所帮助。


问题的背景背景:

在 CQRS 系统中,我们有投影,对视图/投影的任何更改都需要将事件重播到投影上以重新生成视图。如果事件数据库很大,这可能会很昂贵。因此,我构建了一些工具,允许为开发和生产中的应用程序启动重新构建所有视图/投影,能够选择性地重新创建一些视图以提高在冲刺期间更改的速度。要选择性地重新创建视图,我们必须找出哪些视图在冲刺期间发生了变化,并将其作为环境变量传入,以便只应重建正确的视图以加快应用程序的启动时间。这是一个手动过程,很容易发生人为错误,我们可能会错过可能已更改的视图。我想通过检查已更改的文件并使用此更改列表重新生成视图来自动检测在应用程序启动冲刺期间更改的视图。

提前感谢您的所有帮助:)

使用源代码管理系统。今天,Git 是大多数人使用的。Visual Studio 支持 Git(请参阅 Visual Studio 中的版本控制)。就个人而言,我更喜欢使用 Visual Studio 的 Git 扩展。

这些扩展有一个允许比较提交的浏览器。突出显示所有代码更改。旧代码为红色,新代码为绿色。


更新

您可以从类型中的属性创建哈希代码,以查看它们是否已更改:

public static int GetPropertyHash(Type type) {
int hash = 237463;
foreach (PropertyInfo prop in type.GetProperties()) {
unchecked {
hash = hash * 17 + prop.Name.GetHashCode();
hash = hash * 17 + prop.PropertyType.FullName.GetHashCode();
}
}
return hash;
}

如果这还不够,请创建一个单独的应用程序,用于计算相关代码文件的哈希,并将结果作为 C# 代码文件存储到此项目中。或者使用项目中的 T4 模板生成此文件。生成的文件可能是这样的:

public static class SouceCode
{
public static Dictionary<string, int> Hash => new Dictionary<string, int> {
["MyView1.cs"] = 1382683,
["MyPoco.cs"] = -598674579,
};
}

只有使用内置的 String.GetHashCode 方法(继承自 Object)时,哈希才不同。如果您使用自己的哈希方法(更困难)或实现(如哈希代码(在 .NET Core 中),则可以获得所需的内容。

获得稳定的哈希值是解决方案的一部分,已经在其他答案中介绍过。

如果需要在运行时访问 C# 文件,则需要在生成时以某种方式复制它们。在项目文件中,可以嵌入文件,然后从程序集清单中提取它们,也可以将文件复制到 bin/并从磁盘读取它们。

最新更新