【问题标题】:Generate executable with desired variables生成带有所需变量的可执行文件
【发布时间】:2018-05-21 08:36:35
【问题描述】:

我有一个程序,它有一个只属于该用户的唯一用户 ID。该 ID 是硬编码的,并在 Web 界面中使用,用户可以在其中看到他的计算机而不是其他人的计算机,因此每当我需要将我的程序提供给另一个用户时,我都需要使用新的硬编码可执行文件重新编译可执行文件。所以我想制作一个简单的表单,它有一个用于客户端 ID 的文本框和一个编译按钮,因此它编译一个可执行文件,其中客户端 ID 在该可执行文件中硬编码的文本框中。我该怎么做呢? 我对此进行了研究并找到了this,但我认为它不能用于我的情况。

我的程序用于通过 Web 界面控制您的电脑,所以可以说我的网站上有 1 个用户有 2 台电脑。他需要使用我网站数据库中的用户 ID 为他制作一个可执行文件。但是,如果我有另一个用户以及更多用户,我需要制作数千个版本的程序。

另外作为一个附带问题,这可以在网站上完成,假设我的网站上有用户,每个用户都有他唯一的 id,我希望当他们去下载它时,在我的程序中硬编码该 id。请不要过于关注这个问题,因为它只是一个附带问题。

【问题讨论】:

  • 听起来很奇怪。为什么不直接使用命令行参数、mac 地址、Web 服务登录或任何数量的东西。
  • 为什么你不将它包含在配置文件中,而用户同时拥有exe和config?
  • 仅属于该计算机的唯一客户端 ID。 仅供参考,如果您将其用作某种安全机制,那么规避将是微不足道的
  • @HanyHabib - 我怀疑答案将类似于问题中不成文的要求 - OP 没有提到的是希望它具有 防篡改功能。然后我们按照通常的思路,当代码在 users 机器上运行时,这是如何几乎无法解决的。
  • 没错,不要制作 1000 个版本,这是 x/y

标签: c#


【解决方案1】:

我觉得你的想法不是很好,但是你提出了具体的要求,所以我会给你具体的回应。

如果你的程序是msbuildable,那么只需执行

msbuild yoursolution.sln /p:Configuration=Release /p:Platform="Any CPU"

(我在这里使用的是 Release/AnyCPU,但您必须根据您通常编译解决方案的方式使用正确的参数)

通过System.Diagnostics.Process.Start 方法将朝着正确的方向迈出一大步。

很明显,在执行此操作之前,您需要修改 .cs 文件或将包含在程序中的资源。

现在...唯一的问题是,对于较新的 Visual Studio/.NET,msbuild.exe 的位置可能会改变。解决它的最简单方法是手动查找,例如打开 Visual Studio 命令提示符并执行以下操作:

where msbuild.exe

如果您在该命令提示符下使用msbuild.exe 或使用here 给出的指令,第一个路径将被执行

【讨论】:

  • 好的,这可以工作,但它可以在 html 网站后端完成,以便自动完成吗?
  • @DavidAnastasov 您必须在后端安装 Platform SDK 才能编译... 使用 msbuild 不需要特殊权限
  • @DavidAnastasov 最简单的事情是,首先你尝试在命令提示符下使用 msbuild 编译程序,看看需要什么参数,当一切正常时你尝试使用 Process.Start
  • @xanatox 我看到你实现了 p:Configuration 和 p:Platform,我知道这些是随每个解决方案一起提供的,但我可以为我的项目添加类似 p:UserID= 的东西吗?还是不可能?跨度>
  • @DavidAnastasov 修改源文件/资源​​文件更容易...您可以修改 csproj 以便将 UserID 写入某处,但这是黑魔法:-) 更容易直接修改文件。如果您想了解这个黑魔法,这可能是一个很好的起点:stackoverflow.com/q/3585444/613130
猜你喜欢
  • 2015-09-14
  • 1970-01-01
  • 2017-11-17
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
相关资源
最近更新 更多