检测是否从已发布的独立可执行文件运行

时间:2018-08-18 20:17:25

标签: c# .net .net-core

是否有一种简单的方法来检测.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或其他启发式方法?

2 个答案:

答案 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