Visual Studio上Winexe应用被引用编译时自动转为library

起因

WinFormsApp1和WinFormsApp2都是Windows应用程序(WinExe),WinFormsApp2引用了WinFormsApp1。当发布WinFormsApp2时,会提示“未能找到元数据文件”xxxx\xxxx\WinFormsApp1.dll””。如果在项目属性中将WinFormsApp1输出类型改为类库(Library)则WinFormsApp2可以正确发布。缺点是每次发布或者调试WinFormsApp1都需要将输出类型改回WinExe。

方案

编辑WinFormsApp1.csproj,创建BuildAsLibrary属性,并配置OutputType在BuildAsLibrary=true时输出Library,在BuildAsLibrary=false时输出WinExe

WinFormsApp1.csproj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<!-- <OutputType>WinExe</OutputType> -->
<BuildAsLibrary>false</BuildAsLibrary>
<OutputType Condition="'$(BuildAsLibrary)' == 'true'">Library</OutputType>
<OutputType Condition="'$(BuildAsLibrary)' != 'true'">WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

</Project>

编辑WinFormsApp2.csproj,修改WinformsApp1的ProjectReference,设置BuildAsLibrary=true

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\WinFormsApp1\WinFormsApp1.csproj" Properties="BuildAsLibrary=true" />
</ItemGroup>

</Project>

至此,WinFormsApp1和WinFormsApp2可以各自发布成对应的WinExe程序!问题解决!~

本文Demo