🪤

.Net7で単一ファイルexe生成すると起動できない

2024/02/03に公開

同じ現象に遭遇した方が、本来やるべき作業に早く戻れることを祈ります。
役に立ったら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