C#.exe到.dll /执行或运行.dll,好像它是.exe

时间:2016-06-15 22:45:06

标签: c# .net dll

好的,例如我有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引用库运行。

1 个答案:

答案 0 :(得分:0)

如果您需要将其作为流程启动,则有两个选项。两者都不是万无一失的,因为它们使用了一种简单的混淆技术。

  1. 您可以将 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();
    }
    
  2. 您在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();
    }