好的,例如我有2个项目,Form1.exe& console1.exe,我想要的是在form1.exe中执行console1.exe,所以我用了,
if (isLogin(true))
{
MessageBox.Show($"Welcome!");
Process.Start("console1.exe");
现在问题是,为了执行console1.exe,用户必须在本地存储该文件,现在问题是,他/她可以在不执行form1.exe的情况下执行console1.exe
所以我所做的就是使用ILMerge来合并.exe,就像你的.dll一样,但它现在无法找到console1.exe,所以合并没有用。
所以现在我的结论是重新开放视觉工作室&从console1.exe创建一个引用.dll。
问题就是执行.dll,好像它仍然是.exe而不单独调用方法,所以执行文件就好像它是一个方法一样。
所以基本上执行父类,然后将跟进子类。
现在无论如何我可以引用console1.exe并将其合并到form1.exe,防止用户将其作为独奏应用程序运行,或者是否可以在console1.exe上设置它可能不会执行的规则,除非从form1调用.exe,或第二个结论,在一个命令而不是多个子类中将其作为.dll引用库运行。
答案 0 :(得分:0)
如果您需要将其作为流程启动,则有两个选项。两者都不是万无一失的,因为它们使用了一种简单的混淆技术。
您可以将 console1.exe 的文件扩展名更改为 console1.notAnExe 。您仍然可以使用Process.Start()
方法将其作为应用程序启动。您只需创建一个ProcessStartInfo
对象并将UseShellExecute
属性设置为false
。请注意,因为此选项意味着任何有权将扩展名更改回.exe的人都可以运行该应用程序。
private static void StartAProcess(string proc)
{
var ps = new ProcessStartInfo(proc);
ps.UseShellExecute = false;
var p = Process.Start(ps);
p.WaitForExit();
}
您在console1.exe启动方法Main(string[] args)
中使用一种简单的技术,该方法读入特殊的命令行参数。如果此命令行参数存在,则继续处理。如果命令行参数不存在,则只返回。请注意,因为任何知道命令行参数的人仍然可以启动console1.exe并在快捷方式中传递该命令行参数。
static void Main(string[] args)
{
if (args == null ||
args.Length <= 0 ||
!args[0].Equals(
"/SpecialParameter",
StringComparison.OrdinalIgnoreCase))
{
return;
}
// Do something if the /SpecialParameter exists.....
}
private static void StartAProcess(string proc)
{
var ps = new ProcessStartInfo(proc);
ps.UseShellExecute = false;
ps.Arguments = "/SpecialParameter";
var p = Process.Start(ps);
p.WaitForExit();
}