🪤
.Net7で単一ファイルexe生成すると起動できない
同じ現象に遭遇した方が、本来やるべき作業に早く戻れることを祈ります。
役に立ったらLike押してね。
起動できなくなる現象の再現
単一ファイルのexeにすると起動できなくなる現象を確認しました。具体的なソースは以下です。
このソースは古くからお世話になっているdobon.netさんのサンプルを改変したものです。
namespace WinFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
System.Diagnostics.FileVersionInfo ver =
System.Diagnostics.FileVersionInfo.GetVersionInfo(
System.Reflection.Assembly.GetExecutingAssembly().Location);
this.Text = ver.ProductName + " " + ver.ProductVersion;
}
}
}
正常起動時
問題なく、フォームタイトルにバージョンが記載されています。
異常発生時
単一ファイルとしてexeを生成すると、WinFormsApp1.exe をダブルクリックしても何も反応しません。イベントログには以下の出力があります。
ログの名前: Application
ソース: Application Error
日付: 2024/02/03 11:29:48
イベント ID: 1000
タスクのカテゴリ: アプリケーション クラッシュ イベント
レベル: エラー
キーワード:
ユーザー: X1C\kawahara
コンピューター: X1C
説明:
障害が発生しているアプリケーション名: WinFormsApp1.exe、バージョン: 1.0.0.0、タイム スタンプ: 0x641de100
障害が発生しているモジュール名: KERNELBASE.dll、バージョン: 10.0.22621.2792、タイム スタンプ: 0x3091b6fb
例外コード: 0xe0434352
障害オフセット: 0x000000000006567c
障害が発生しているプロセス ID: 0x0x65D4
障害が発生しているアプリケーションの開始時刻: 0x0x1DA5648DB63EDB9
障害が発生しているアプリケーション パス: C:\Users\kawahara\source\repos\WinFormsApp1\bin\Release\net7.0-windows\publish\win-x64\WinFormsApp1.exe
障害が発生しているモジュール パス: C:\WINDOWS\System32\KERNELBASE.dll
レポート ID: cdb4f675-1fde-4221-945d-ccde0d6f9b03
障害が発生しているパッケージの完全な名前:
障害が発生しているパッケージに関連するアプリケーション ID:
イベント XML:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Application Error" Guid="{a0e9b465-b939-57d7-b27d-95d8e925ff57}" />
<EventID>1000</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>100</Task>
<Opcode>0</Opcode>
<Keywords>0x8000000000000000</Keywords>
<TimeCreated SystemTime="2024-02-03T02:29:48.0874120Z" />
<EventRecordID>44109</EventRecordID>
<Correlation />
<Execution ProcessID="32104" ThreadID="28452" />
<Channel>Application</Channel>
<Computer>X1C</Computer>
<Security UserID="S-1-5-21-432896938-2027035327-877757744-1001" />
</System>
<EventData>
<Data Name="AppName">WinFormsApp1.exe</Data>
<Data Name="AppVersion">1.0.0.0</Data>
<Data Name="AppTimeStamp">641de100</Data>
<Data Name="ModuleName">KERNELBASE.dll</Data>
<Data Name="ModuleVersion">10.0.22621.2792</Data>
<Data Name="ModuleTimeStamp">3091b6fb</Data>
<Data Name="ExceptionCode">e0434352</Data>
<Data Name="FaultingOffset">000000000006567c</Data>
<Data Name="ProcessId">0x65d4</Data>
<Data Name="ProcessCreationTime">0x1da5648db63edb9</Data>
<Data Name="AppPath">C:\Users\kawahara\source\repos\WinFormsApp1\bin\Release\net7.0-windows\publish\win-x64\WinFormsApp1.exe</Data>
<Data Name="ModulePath">C:\WINDOWS\System32\KERNELBASE.dll</Data>
<Data Name="IntegratorReportId">cdb4f675-1fde-4221-945d-ccde0d6f9b03</Data>
<Data Name="PackageFullName">
</Data>
<Data Name="PackageRelativeAppId">
</Data>
</EventData>
</Event>
ログの名前: Application
ソース: .NET Runtime
日付: 2024/02/03 11:29:48
イベント ID: 1026
タスクのカテゴリ: なし
レベル: エラー
キーワード: クラシック
ユーザー: N/A
コンピューター: X1C
説明:
Application: WinFormsApp1.exe
CoreCLR Version: 7.0.523.17405
.NET Version: 7.0.5
Description: The process was terminated due to an unhandled exception.
Exception Info: System.ArgumentException: The path is empty. (Parameter 'path')
at System.IO.Path.GetFullPath(String path)
at System.Diagnostics.FileVersionInfo.GetVersionInfo(String fileName)
at WinFormsApp1.Form1..ctor() in C:\Users\kawahara\source\repos\WinFormsApp1\Form1.cs:line 9
at WinFormsApp1.Program.Main() in C:\Users\kawahara\source\repos\WinFormsApp1\Program.cs:line 14
イベント XML:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name=".NET Runtime" />
<EventID Qualifiers="0">1026</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>0</Task>
<Opcode>0</Opcode>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2024-02-03T02:29:48.0103393Z" />
<EventRecordID>44108</EventRecordID>
<Correlation />
<Execution ProcessID="26068" ThreadID="0" />
<Channel>Application</Channel>
<Computer>X1C</Computer>
<Security />
</System>
<EventData>
<Data>Application: WinFormsApp1.exe
CoreCLR Version: 7.0.523.17405
.NET Version: 7.0.5
Description: The process was terminated due to an unhandled exception.
Exception Info: System.ArgumentException: The path is empty. (Parameter 'path')
at System.IO.Path.GetFullPath(String path)
at System.Diagnostics.FileVersionInfo.GetVersionInfo(String fileName)
at WinFormsApp1.Form1..ctor() in C:\Users\kawahara\source\repos\WinFormsApp1\Form1.cs:line 9
at WinFormsApp1.Program.Main() in C:\Users\kawahara\source\repos\WinFormsApp1\Program.cs:line 14
</Data>
</EventData>
</Event>
エラーの発生要因
learn.microsoft.comの単一ファイルのデプロイにある、[API の非互換性](API の非互換性)に直接的な記載はないですが、System.Reflection.Assembly.GetExecutingAssembly().Location 部分でnullを返してくるのが原因のようです。
単一ファイルでexeを生成する手順
Discussion