[英]The referenced project is a non self-contained executable. A non self-contained executable cannot be referenced by a self-contained executable
[英]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.