【问题标题】:C# .exe to .dll / execute or run .dll as if it were a .exeC# .exe 到 .dll / 像 .exe 一样执行或运行 .dll
【发布时间】:2016-06-15 22:45:05
【问题描述】:

好吧,比如我有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,因此合并不起作用。

所以现在我的结论是重新打开 Visual Studio 并从 console1.exe 创建一个引用 .dll。

这样做的问题是执行 .dll 就好像它仍然是一个 .exe 而没有单独调用方法一样,所以要像执行一个方法一样执行文件。

所以基本上执行父类,然后将跟进子类。

现在无论如何我可以引用console1.exe并将其合并到form1.exe,以防止用户将其作为单独的应用程序运行,或者是否可以在console1.exe上设置规则,除非从form1调用,否则它可能不会执行.exe,或者第二个结论是在一个命令而不是多个子类中将其作为 .dll 参考库运行。

【问题讨论】:

  • 您需要将第二个应用程序作为 .dll 运行。 Process.Start 与从 Windows 启动它相同,因此没有真正的方法来限制调用应用程序。通常,在将 .exe 转换为 .dll 时,您只需要担心创建入口点,因为您没有使用 .exe 将使用的相同入口点,然后从您的父应用程序调用它。自从我在 C#/.NET 中完成此操作以来已经 很长 时间了。
  • 您是否试图限制用户运行console1.exe,因为您不希望他们访问console1.exe(了解它),或者您只是想确保他们不能手动运行它以执行其内容?基本上,如果有人运行了 console1.exe 并且手动运行它什么也没做,它仍然可以吗?刚开始又停止了?
  • 是的,几乎所有东西都可以防止它在不被 form1.exe 使用的情况下运行

标签: c# .net dll


【解决方案1】:

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

  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();
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2015-11-04
    • 2013-08-03
    • 1970-01-01
    • 2019-02-22
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多