我试图找到一种方法来为我正在处理的程序安装启动器/更新程序。它会让人注册,而不是让他们在没有注册的情况下运行主程序。所以,比方说,我有launcher.exe和main.exe,我打开main.exe。我需要它退出并打开启动器。我打算用套接字做一个简单的ping / pong类型的交易,但是套接字在vb.net中打破了我的脸,因为我只在vb6中使用它们。
对不起文字墙:)
答案 0 :(得分:1)
我建议使用“秘密”命令行参数。
当Launcher启动Main时,它将执行
C:\Path\Main -Launched
如果用户双击Main.exe(或在DOS提示符下键入“Main”),则不会看到命令行参数。所以在Main中,如果命令行没有-Launched
参数,它会启动Launcher然后退出。如果它具有-Launched
参数,您可以假设它是由Launcher应用程序启动并继续。
唯一的缺点是黑客可以将Main.exe重命名为Main2.exe,然后安装自己版本的Main.exe,显示命令行,然后启动Main2。这将允许他们看到“秘密”命令行参数。但是,即便是大多数黑客都不会为此烦恼,而非黑客也永远不会看到这个参数。但如果你担心这一点,你可以这样做:
(注意:未经测试,此处可能存在轻微的印刷错误。)
' In Launcher:
' ...
Dim Param as string = Now.ToString("MMddhhmmss").GetHashCode.ToString
' Now launch Main, using Param as the command-line parameter
' ...
' Somewhere in Main, probably in the main form's Form1_Load:
' ...
Dim H As Integer = 0
Integer.TryParse(Command, H)
Dim T As Date = Now
Dim Launched As Boolean = False
For I As Integer = 0 To 30
Dim X As Integer = T.AddSeconds(-I).ToString("MMddhhmmss").GetHashCode
If X = H Then
Launched = True
Exit For
End If
Next I
If Not Launched Then
' Assume that user launched program directly
' Start Launcher, then exit
End If
' The program was started from Launcher. Continue.
' ...
此代码假定当Launcher启动Main时,Main的代码在30秒内开始执行。 (如果证明是错误的,则可能必须增加I
循环中的最大值。)
答案 1 :(得分:1)
我会扭转整个事情。而不是启动您的主程序并让它与您的更新程序一起玩切换游戏,将您的“主”图标和程序名称分配给更新程序,并让它在启动时检查并更新真正的主应用程序。然后它将在退出之前启动您的真实应用程序。这样只有一个开关而不是两个。
Savy用户将能够直接找到并运行您的真实.exe文件,但绝大多数文件只是隐藏在程序文件文件夹中的另一个文件。
另一个选择是使您的主程序成为dll(类库项目)而不是.exe文件,并在启动后使用Assembly.LoadFile()
函数动态加载它。只要您进入该dll的入口点保持一致,并且使用户更难直接运行主程序而不使用更新程序,这是安全的。