C# 在编译器时间和永远生成随机值

C# 在编译器时间和永远生成随机值,c#,winforms,random,C#,Winforms,Random,所以,我不知道我的问题是否完全清楚,但我想做的是一个简单的概念:我想在编译一个c#windows窗体应用程序时,一个变量X假设一个我不知道的值。但每次我执行应用程序而不重新编译它时,该值都是相同的(但您不知道)。所以我想问的是,是否有可能编译一些你不知道会是哪个值的东西。应用程序每次都将使用具有相同值的相同变量,但每次再次编译应用程序时,该变量都会发生变化 我正在尝试实现一种安全算法,该算法对于我的应用程序的每个发行版都是不同的,但我希望以一种自动的方式来实现,而不必为我的应用程序的每个发行版更

所以,我不知道我的问题是否完全清楚,但我想做的是一个简单的概念:我想在编译一个c#windows窗体应用程序时,一个变量X假设一个我不知道的值。但每次我执行应用程序而不重新编译它时,该值都是相同的(但您不知道)。所以我想问的是,是否有可能编译一些你不知道会是哪个值的东西。应用程序每次都将使用具有相同值的相同变量,但每次再次编译应用程序时,该变量都会发生变化

我正在尝试实现一种安全算法,该算法对于我的应用程序的每个发行版都是不同的,但我希望以一种自动的方式来实现,而不必为我的应用程序的每个发行版更改手动参数

我的意思的一个简单例子:

  • (编译时)i=rand()
  • (执行应用程序时)i=?(有些值您永远不会知道,但每次执行应用程序时都会相同)

您可以在构建时生成源或资源,并将该值作为该源的一部分包含在内

链接:显示如何在构建时创建资源,您还可以签出以构建更集成的解决方案

请注意,这类保护很容易规避…

C#编译器在每个构建中都会发出一个唯一的(随机的)(Guid)。即使从完全相同的源构建,这也会有所不同

您可以将其用作生成令牌

如前所述,您可以通过以下方式获得该值:

this.GetType().Assembly.ManifestModule.ModuleVersionId

评论者没有阅读完整的问题。。。“每次你再次编译应用程序时,这个变量都会改变”我不认为有任何方法可以内置到普通的C#编译器中。但是,如果接收者可以简单地反编译应用程序,那么这些都不会对您有任何好处,因此您肯定是在编译后运行模糊处理程序。编译后的步骤就是插入这个神奇值的地方,无论是在模糊处理期间还是之前。你可以利用T4模板来生成包含新随机数的新源代码文件。哼哼,我可以使用t4模板来执行生成随机值的方法吗?@abatishchev让t4运行编译时可能比创建任务(除非它已经在项目中使用)的开销更大。嗯,有趣的是,我认为在运行生成随机RSA密钥的方法时,每次我重建应用程序时,都会生成一个不同的密钥并保存在一个向量中。它可以像这样找到:
this.GetType().Assembly.ManifestModule.ModuleVersionId
。哦,天哪,这正是我所需要的,我可以将它用作一个函数的种子,我知道它将在每次打开应用程序时执行相同的操作,但我不知道种子。非常感谢xD我现在非常高兴xD xD xD,感谢oɔɯǝɹ和@Enigmativity