如何确保通过另一个可执行文件打开可执行文件?

Jos*_*lds 8 c# windows

还有,你可以用它来从未有OS按住锁一个整洁的小把戏.dll的/ .exe是个.exe需要运行.

假设我们的目录如下所示:

>opener.exe
>actualProgram.exe
>dependency.dll

作为一个基本的例子,我们可以这样做:

namespace Opener
{
    class Program
    {
        static void Main(string[] args)
        {

            AppDomain domain = AppDomain.CurrentDomain;
            AppDomain newDomain = AppDomain.CreateDomain(
                domain.FriendlyName,
                domain.Evidence,
                domain.BaseDirectory,
                domain.RelativeSearchPath,
                true,  // "shadow copy" files: copy rather than lock
                domain.SetupInformation.AppDomainInitializer,
                domain.SetupInformation.AppDomainInitializerArguments
            );
            string assembly = 
                System.Reflection.Assembly.GetExecutingAssembly().Location 
                + "\\..\\actualProgram.exe";
            newDomain.ExecuteAssembly(assembly, args);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我们还可以在那里放置更多逻辑,actualProgram.exe尽管正在打开一个进程实例,我们可以使用它来实际替换/更新.试一试:当你通过"开启者"加载它时,你将能够删除/修改/替换依赖项和"实际"程序.显然这有其好处,即更新更容易.

但是在你的"actual.exe"中,你怎么能确定它是通过另一个可执行文件加载的,并且知道它是在没有锁定的情况下加载的.exe?如果有人要加载"actual.exe",即不通过"开启者",我想确保该过程立即退出.

提示?

the*_*heB 2

  1. 传递一个命令行参数,actualProgram.exe让它知道它是由启动器启动的。(也在 oleksii 对 OP 的评论中建议)
  2. 在启动器中设置一个可由子进程继承的环境变量。
  3. 使用记录的方法之一来获取父进程 ID,并使用它来获取有关启动进程的信息。(当然,如果父进程终止,Windows 可以自由地将 PID 重新分配给新进程。)
  4. 创建内存映射文件/命名管道/等。在启动器中,可用于将信息传递给子级。
  5. 手动加载和卸载子项中的库引用。如果它们是 .Net 程序集,您可以使用该AssemblyResolve事件,将文件从磁盘加载到字节数组中并使用Assembly.Load(byte[], byte[])重载。

注意:只要在修改/移动/删除所有程序集之前手动或由运行时加载它们,就可能没问题。此外,加载 DLL 后对其进行更改可能不会对正在运行的进程产生影响。我说可能在这两种情况下,因为在运行时保留库通常是一个好主意,特别是如果您不手动加载它们。

也可以看看: