.NET 4迁移至.NET 6后程序集文件路径异常问题
.NET 6 WinForms项目Assembly.Location返回DLL而非EXE的解决方法
问题根源
.NET 6+的Windows Forms框架依赖项目默认会生成一个轻量级存根EXE(如myproject.exe),它仅负责加载并启动实际的程序集myproject.dll。因此Assembly.GetExecutingAssembly().Location会返回DLL的路径,PostBuild事件中若直接输出文件,也会看到DLL是核心输出文件。
解决配置
根据需求选择以下方案:
方案1:生成独立自包含EXE
在.csproj的<PropertyGroup>中添加以下配置,发布后会生成不依赖.NET运行时的单文件EXE,此时Assembly.GetExecutingAssembly().Location将指向该EXE:
<PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net6.0-windows</TargetFramework> <Nullable>enable</Nullable> <UseWindowsForms>true</UseWindowsForms> <ImplicitUsings>enable</ImplicitUsings> <!-- 新增配置 --> <PublishSingleFile>true</PublishSingleFile> <SelfContained>true</SelfContained> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- 按需替换为win-x86/win-arm64 --> </PropertyGroup>
方案2:框架依赖模式下获取EXE路径(推荐)
如果不想改为自包含发布,官方推荐使用Environment.ProcessPath获取当前进程的EXE路径,这是更可靠的方式。若需在PostBuild事件中操作EXE,直接使用$(TargetPath)变量,它会直接指向生成的EXE文件路径。
补充:.NET 7+专属配置
若使用.NET 7或更高版本,可开启UseAppHost确保存根EXE生成,但注意这不会改变Assembly.Location的返回值(仍指向DLL):
<PropertyGroup> <UseAppHost>true</UseAppHost> </PropertyGroup>
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

