--- lang: ja-jp breaks: true --- # Visual Studio .NET Core プロジェクトで、`リンクとして追加` を一括で実行したい 2021-08-12 .NET frameworkのプロジェクトでは、`ALT` を押しながらエクスプローラからファイルをドラッグ&ドロップすると、該当ファイルが、`リンクとして追加` されていた。 .NET Core プロジェクトでは、同様の操作を行ってもファイルの実態がコピーされてしまう。 `リンクとして追加`を簡単に一括で行いたいが、簡単な方法がわからない。。。 ## `*.csproj`に簡単に記述する方法 > VisualStudioであるフォルダ以下の全てのソースコードをリンクとしてプロジェクトに取り込みたいとき > https://spiratesta.hatenablog.com/entry/20131120/1384915752 > MSBuild の既知の項目メタデータ > https://docs.microsoft.com/ja-jp/visualstudio/msbuild/msbuild-well-known-item-metadata > 方法: ビルドするファイルを選択する > https://docs.microsoft.com/ja-jp/visualstudio/msbuild/how-to-select-the-files-to-build ```xml= <PropertyGroup> <TargetBaseDir>..\XXXXXXXX\</TargetBaseDir> </PropertyGroup> <ItemGroup> <Compile Include="$(TargetBaseDir)Properties\Resources.Designer.cs" Link="Properties\Resources.Designer.cs" /> <EmbeddedResource Include="$(TargetBaseDir)Properties\Resources.resx" Link="Properties\Resources.resx" /> <Content Include="$(TargetBaseDir)Resources\*.*" Link="Resources\%(FileName)%(Extension)" /> </ItemGroup> <ItemGroup> <Compile Include="$(TargetBaseDir)**\client\*.*" Link="%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetBaseDir)**\dialog\*.cs" Link="%(RecursiveDir)\%(FileName)%(Extension)" /> <EmbeddedResource Include="$(TargetBaseDir)**\dialog\*.resx" Link="%(RecursiveDir)\%(FileName)%(Extension)"> <DependentUpon>%(FileName).cs</DependentUpon> </EmbeddedResource> <Compile Include="$(TargetBaseDir)**\form\*.cs" Link="%(RecursiveDir)\%(FileName)%(Extension)" /> <EmbeddedResource Include="$(TargetBaseDir)**\form\*.resx" Link="%(RecursiveDir)\%(FileName)%(Extension)"> <DependentUpon>%(FileName).cs</DependentUpon> </EmbeddedResource> <Compile Include="$(TargetBaseDir)**\usercontrol\*.cs" Link="%(RecursiveDir)\%(FileName)%(Extension)" /> <EmbeddedResource Include="$(TargetBaseDir)**\usercontrol\*.resx" Link="%(RecursiveDir)\%(FileName)%(Extension)"> <DependentUpon>%(FileName).cs</DependentUpon> </EmbeddedResource> <Page Include="$(TargetBaseDir)**\control\*.xaml" Link="%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetBaseDir)**\control\*.cs" Link="%(RecursiveDir)\%(FileName)%(Extension)" /> <EmbeddedResource Include="$(TargetBaseDir)**\control\*.resx" Link="%(RecursiveDir)\%(FileName)%(Extension)"> <DependentUpon>%(FileName).cs</DependentUpon> </EmbeddedResource> <Compile Include="$(TargetBaseDir)**\manager\*_Win.cs" Link="%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetBaseDir)**\util\*_Win.cs" Link="%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetBaseDir)**\parameter\*_Win.cs" Link="%(RecursiveDir)\%(FileName)%(Extension)" /> </ItemGroup> <ItemGroup> <Compile Remove="$(TargetBaseDir)obj\**" /> <Compile Remove="obj\**" /> <EmbeddedResource Remove="obj\**" /> <None Remove="obj\**" /> <Page Remove="obj\**" /> </ItemGroup> ``` :::warning `EmbeddedResource` の `<DependentUpon>%(FileName).cs</DependentUpon>` は、`.NET Framework` を使用する場合必須。ない場合は実行時エラーとなる。`.NET Core` の場合はなくても動作する。 ::: ### 上記でまとめて追加したLINKの中から一部場外する場合は以下を続けて設定する。 ```xml= <ItemGroup> <Compile Remove="..\XXXXXXXX\zzzz\comm\control\CCCC.*" /> <EmbeddedResource Remove="..\XXXXXXXX\zzzz\comm\control\CCCC.resx" /> <Compile Remove="..\XXXXXXXX\zzzz\comm\control\DDDD.*" /> <EmbeddedResource Remove="..\XXXXXXXX\zzzz\comm\control\DDDD.resx" /> </ItemGroup> ``` ### クリスタルレポートのレポートをリンクしてビルドする場合 ```xml= <ItemGroup> <Compile Include="..\XXXXXXXX\zzzz\user\report\**\*.cs" Link="zzzz\user\report\%(RecursiveDir)\%(FileName)%(Extension)"> <DesignTime>True</DesignTime> <AutoGen>True</AutoGen> <DependentUpon>%(FileName).rpt</DependentUpon> </Compile> <EmbeddedResource Include="..\XXXXXXXX\zzzz\user\report\**\*.rpt" Link="zzzz\user\report\%(RecursiveDir)\%(FileName)%(Extension)"> <Generator>CrystalDecisions.VSDesigner.CodeGen.ReportCodeGenerator</Generator> <LastGenOutput>%(FileName).cs</LastGenOutput> </EmbeddedResource> </ItemGroup> ``` ### リソースファイルの場合 ```xml= <ItemGroup> <Content Include="..\XXXXXXXX\Resources\**.*" Link="Resources\%(RecursiveDir)\%(FileName)%(Extension)" /> </ItemGroup> ``` ### XAML ```xml= <ItemGroup> <Compile Include="..\XXXXXXXX\zzzz\imple\control\**\*.cs" Link="zzzz\imple\control\%(RecursiveDir)\%(FileName)%(Extension)" /> <Page Include="..\XXXXXXXX\zzzz\imple\control\**\*.xaml" Link="zzzz\imple\control\%(RecursiveDir)\%(FileName)%(Extension)" /> </ItemGroup> ``` ## プロパティを変数として使用する :::warning プロパティは、同じ名称で複数回定義すると、`csproj`ファイル内で最後に定義した値で展開される為注意が必要。 ::: ```xml= <PropertyGroup> <TargetProjectDir>..\XXXXXXXX\</TargetProjectDir> </PropertyGroup> <ItemGroup> <Compile Include="$(TargetProjectDir)Properties\Resources.Designer.cs" Link="Properties\Resources.Designer.cs" /> <EmbeddedResource Include="$(TargetProjectDir)Properties\Resources.resx" Link="Properties\Resources.resx" /> <Content Include="$(TargetProjectDir)Resources\**\*" Link="Resources\%(RecursiveDir)\%(FileName)%(Extension)" /> </ItemGroup> <PropertyGroup> <TargetBaseDir>zzzz\</TargetBaseDir> </PropertyGroup> <ItemGroup> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\behavior\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\client\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\data\win\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\control\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <EmbeddedResource Include="$(TargetProjectDir)$(TargetBaseDir)**\control\**\*.resx" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)"> <DependentUpon>%(FileName).cs</DependentUpon> </EmbeddedResource> <Page Include="$(TargetProjectDir)$(TargetBaseDir)**\control\**\*.xaml" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\dialog\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <EmbeddedResource Include="$(TargetProjectDir)$(TargetBaseDir)**\dialog\**\*.resx" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)"> <DependentUpon>%(FileName).cs</DependentUpon> </EmbeddedResource> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\form\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <EmbeddedResource Include="$(TargetProjectDir)$(TargetBaseDir)**\form\**\*.resx" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)"> <DependentUpon>%(FileName).cs</DependentUpon> </EmbeddedResource> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\process\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\report\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" Exclude="$(TargetProjectDir)$(TargetBaseDir)**\report\**\*.Designer.cs"> <DependentUpon>%(FileName).rpt</DependentUpon> </Compile> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\report\**\*.Designer.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)"> <DependentUpon>$([System.String]::Copy('%(FileName)%(Extension)').Replace('.Designer',''))</DependentUpon> </Compile> <EmbeddedResource Include="$(TargetProjectDir)$(TargetBaseDir)**\report\**\*.rpt" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)"> <Generator>CrystalDecisions.VSDesigner.CodeGen.ReportCodeGenerator</Generator> <LastGenOutput>%(FileName).cs</LastGenOutput> </EmbeddedResource> <EmbeddedResource Include="$(TargetProjectDir)$(TargetBaseDir)**\report\**\*.resx" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)"> <DependentUpon>%(FileName).cs</DependentUpon> </EmbeddedResource> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\selector\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\style\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <Page Include="$(TargetProjectDir)$(TargetBaseDir)**\style\**\*.xaml" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\usercontrol\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" Exclude="$(TargetProjectDir)$(TargetBaseDir)**\usercontrol\**\*.Designer.cs" > <SubType>UserControl</SubType> </Compile> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\usercontrol\**\*.Designer.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)"> <DependentUpon>$([System.String]::Copy('%(FileName)%(Extension)').Replace('.Designer',''))</DependentUpon> </Compile> <EmbeddedResource Include="$(TargetProjectDir)$(TargetBaseDir)**\usercontrol\**\*.resx" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" > <DependentUpon>%(FileName).cs</DependentUpon> </EmbeddedResource> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\util\win\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\view\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <Page Include="$(TargetProjectDir)$(TargetBaseDir)**\view\**\*.xaml" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\viewmodel\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\manager\win\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> <Compile Include="$(TargetProjectDir)$(TargetBaseDir)**\parameter\win\**\*.cs" Link="$(TargetBaseDir)%(RecursiveDir)\%(FileName)%(Extension)" /> </ItemGroup> ``` ###### tags: `MSBuild` `.NET Core` `Visual Studio` `リンクとして追加` `Link` `Crystal Reports` `SDKスタイル`