【发布时间】: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.exe 是dotnet 的分布式副本的包装器,其中包含自包含应用程序,它调用相同的myapp.dll。
在不知道从哪里运行的情况下,我每次发布应用程序时都需要更改参数,这会显着减慢开发速度并使构建自动化变得更加困难。
是否有一种“正常”的方式——即由具有某些属性或方法的框架支持——检测这种情况的方法,而不检查工作目录中是否存在 myapp.exe 或其他一些启发式方法?
【问题讨论】: