簡體   English   中英

檢測是否從已發布的自包含可執行文件運行

[英]Detect if running from published self-contained executable

是否有一種簡單的方法可以檢測.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或其他啟發式方法?

看起來像Assembly.GetEntryAssembly()被重定向到您的.dll,但您應該能夠看到Process的真實可執行文件。 例如

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

這更像是一個操作系統級別的API。

這是一個錯誤的方向/方法。

實現我想要的:

一個。 構建 - >配置管理器... - >新配置

將其命名為例如Publish

C。 將以下內容添加到.csproj文件中:

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

d。 dotnet publish使用newlly創建的Publish配置或從VS Publish...向導使用。

使用代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM