代码之家  ›  专栏  ›  技术社区  ›  V.B.

检测是否从已发布的自包含可执行文件运行

  •  3
  • V.B.  · 技术社区  · 6 年前

    dotnet 安装在系统上还是独立分发?

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

    我正在使用.NET Core并发布创建 myapp.exe . 在设计和调试期间,程序使用 点网 命令和我使用以下命令启动另一个具有特定cli参数的进程:

    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.exe 是的分布式副本的包装 点网 与独立的应用程序打包,它调用相同的 .

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

    是否有一种“正常”的方法(即框架支持某些属性或方法)来检测,而不检查 myapp.exe

    2 回复  |  直到 6 年前
        1
  •  2
  •   David Browne - Microsoft    6 年前

    似乎Assembly.GetEntryAssembly()已重定向到您的.dll,但您应该能够看到带有进程的真正可执行文件。如

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

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

        2
  •  1
  •   V.B.    6 年前

    为了达到我的目的:

    答。 生成->配置管理器。。。->新配置

    乙。 给它起个名字。 Publish

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

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

    d。 使用新创建的 发布 配置 dotnet publish 或来自VS Publish... 巫师。

    e。

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