是否有一种简单的方法来检测.NET Core应用程序是从系统上安装的decoder_model.predict
还是独立的发行版中运行?
我正在研究一个构建自动化脚本,该脚本需要一些有关相对路径和入口点的知识,以便使用cli args创建依赖进程。
我正在使用.NET Core并发布创建dotnet
的自包含应用程序。在设计和调试期间,该程序使用myapp.exe
命令运行,我使用以下命令使用特定的cli参数启动另一个进程:
dotnet
但是在独立的应用程序中,文件名应为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
的分布式副本的包装,并且它调用相同的{{1 }}。
在不知道我从哪里运行的情况下,每次发布应用程序时都需要更改参数,这显着减慢了开发速度,并使构建自动化更加困难。
是否存在“正常”(即由具有某些属性或方法的框架所支持)是否可以检测到此状态,而无需检查工作目录中是否存在dotnet
或其他启发式方法?
答案 0 :(得分:2)
看起来Assembly.GetEntryAssembly()重定向到您的.dll,但是您应该能够使用Process看到真正的可执行文件。例如
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
更多是操作系统级别的API。
答案 1 :(得分:1)
这是错误的方向/方法。
实现我想要的:
a。构建->配置管理器...->新配置
b 。将其命名为Publish
c。。将以下内容添加到.csproj
文件中:
<PropertyGroup Condition="'$(Configuration)'=='Publish'">
<DefineConstants>$(DefineConstants);PUBLISHED</DefineConstants>
</PropertyGroup>
d。使用Publish
或VS dotnet publish
向导中新创建的Publish...
配置。
e。。从代码中使用:
#if PUBLISHED
Console.WriteLine("+++++++++++ Running from published +++++++++++++");
#endif