有没有一种简单的方法来检测 .NET Core 应用程序是从dotnet系统上安装的还是独立发行版运行的?
我正在开发一个构建自动化脚本,该脚本需要一些有关相对路径和入口点的知识,以便使用 cli 参数创建依赖进程。
我正在使用 .NET Core 并发布创建myapp.exe. 在设计和调试期间,程序使用dotnet命令运行,我使用以下命令来启动具有特定 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
};
Run Code Online (Sandbox Code Playgroud)
但在独立的应用程序中,文件名应该是FileName = "myapp.exe"和Arguments = argsString。但是,该属性typeof(Program).Assembly.Location仍然返回myapp.dll,因为它是与独立应用程序打包的myapp.exe分布式副本的包装器,并且它调用相同的.dotnetmyapp.dll
在不知道我从哪里运行的情况下,我每次发布应用程序时都需要更改参数,这会显着减慢开发速度并使构建自动化变得更加困难。
是否有一种“正常” - 即由具有某些属性或方法的框架支持 - 检测此问题的方法,而不检查是否myapp.exe存在于工作目录或其他启发式中?
看起来 Assembly.GetEntryAssembly() 被重定向到您的 .dll,但您应该能够通过 Process 看到真正的可执行文件。例如
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
Run Code Online (Sandbox Code Playgroud)
这更像是一个操作系统级的 API。