【问题标题】:Detect if running from published self-contained executable检测是否从已发布的自包含可执行文件运行
【发布时间】:2018-08-18 20:17:24
【问题描述】:

是否有一种简单的方法来检测 .NET Core 应用程序是从系统上安装的 dotnet 运行还是自包含的分发版运行?

我正在编写一个构建自动化脚本,该脚本需要一些关于使用 cli args 创建依赖进程的相对路径和入口点的知识。

我正在使用 .NET Core 并发布创建 myapp.exe 的自包含应用程序。在设计和调试期间,程序使用dotnet 命令运行,我使用以下命令使用特定的 cli args 启动另一个进程:

var filename = typeof(Program).Assembly.Location; // .../myapp.dll
var argsString = string.Join(" ", args);
var startInfo = new ProcessStartInfo
            {
                Arguments = filename + " " + argsString, 
                UseShellExecute = false,
                RedirectStandardOutput = true,
                FileName = "dotnet",
                CreateNoWindow = false,
                WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory
            };

但是在独立应用程序中,文件名应该是FileName = "myapp.exe"Arguments = argsString。但是,typeof(Program).Assembly.Location 属性仍然返回myapp.dll,因为myapp.exedotnet 的分布式副本的包装器,其中包含自包含应用程序,它调用相同的myapp.dll

在不知道从哪里运行的情况下,我每次发布应用程序时都需要更改参数,这会显着减慢开发速度并使构建自动化变得更加困难。

是否有一种“正常”的方式——即由具有某些属性或方法的框架支持——检测这种情况的方法,而不检查工作目录中是否存在 myapp.exe 或其他一些启发式方法?

【问题讨论】:

    标签: c# .net .net-core


    【解决方案1】:

    看起来 Assembly.GetEntryAssembly() 被重定向到您的 .dll,但您应该能够通过 Process 看到真正的可执行文件。例如

    System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
    

    这更像是一个操作系统级别的 API。

    【讨论】:

      【解决方案2】:

      这是一个错误的方向/方法。

      实现我想要的:

      a. 构建 -> 配置管理器... -> 新配置

      b. 给它命名,例如Publish

      c. 将以下内容添加到.csproj 文件:

      <PropertyGroup Condition="'$(Configuration)'=='Publish'">
        <DefineConstants>$(DefineConstants);PUBLISHED</DefineConstants>
      </PropertyGroup>
      

      d.dotnet publish 或VS Publish... 向导中使用新创建的Publish 配置。

      e.从代码中使用:

      #if PUBLISHED
                  Console.WriteLine("+++++++++++ Running from published +++++++++++++");
      #endif
      

      【讨论】:

      • 这是一个好方法。也可以使用System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
      • @DavidBrowne-Microsoft 太好了,正是我问的。发布它作为答案,它是你的! :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多