前置き
AIによって生成した記事になります。
個人的な解釈としては「AssemblyInfo.csに書くのもアリ」というAIの結論に対して以下の点から結局 csproj に書くのが安心なのかなぁ、と思っています。
- 公式が csproj に書くことを推奨していることは、そのうち AssemblyInfo.cs を用いたやり方がサポートされなくなってしまうかも?
- ビルドプロセスに適用しやすいということは、CI/CD環境でもトラブルになりにくいのでは?
AssemblyInfo.cs と csproj の変遷:InternalsVisibleTo の記述場所の変化
1. 昔のAssemblyInfo.csの時代
.NET Framework や初期の .NET Core では、アセンブリ情報 (InternalsVisibleTo
を含む) を AssemblyInfo.cs
に記述するのが一般的でした。
昔の書き方 (AssemblyInfo.cs)
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("MyCompany.MyProject.Tests")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
メリット
- 明示的で分かりやすい(アセンブリに関連する情報が
AssemblyInfo.cs
にまとまっている) -
csproj
をシンプルに保てる - すぐに編集可能**(手軽に追加・削除しやすい)
デメリット
- 手動で作成が必要(
AssemblyInfo.cs
がない場合は作らないといけない) - アセンブリの情報が複数のファイルに分散しがち
- 自動生成される場合があり、変更しづらいケースがある(.NET Core 以降)
2. .csproj に書くようになった理由
.NET Core 以降(特に .NET 5+ 以降)では、アセンブリ情報の自動生成が一般化 したため、AssemblyInfo.cs
に記述しなくても済むようになりました。
現代の書き方 (csproj)
<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>MyCompany.MyProject.Tests</_Parameter1>
</AssemblyAttribute>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
<_Parameter1>DynamicProxyGenAssembly2</_Parameter1>
</AssemblyAttribute>
</ItemGroup>
メリット
- アセンブリ情報を
csproj
に一元化できる - 追加・削除がビルドプロセスで適用されるため、管理がしやすい
-
AssemblyInfo.cs
が不要になり、コードのクリーンアップが可能 - MSBuild に統合されているため、プロジェクトごとの設定がしやすい
デメリット
- 直感的でない(C# コードの中でなく XML に書くのは少し面倒)
- IDE の補完が効かない(
AssemblyInfo.cs
ならusing System.Runtime.CompilerServices;
など補完が効く)
3. どっちが推奨?
✅ 推奨される書き方
- 新規プロジェクト (.NET Core 以降, .NET 5+) →
csproj
に書く(公式推奨の流れ) - 既存の
.NET Framework
や.NET Core
のプロジェクト →AssemblyInfo.cs
のままでもOK - 設定が少なく、IDE の補完を活用したい場合 →
AssemblyInfo.cs
に書くのもアリ
公式的には csproj
に記述する方法が主流になりつつある ものの、
「可読性・メンテナンスしやすさ」の観点では AssemblyInfo.cs
に書くのも 十分に合理的な選択肢 です。
4. 結論
「どちらの方法も正解。ただし、プロジェクトやチームの方針による」
- .NET Core 以降では
csproj
に書くのが公式推奨 - 昔ながらの
AssemblyInfo.cs
の方が「C# コードとして管理しやすい」 - どちらを使うかはプロジェクトのポリシー次第
- 「複数の
InternalsVisibleTo
を書く場合、AssemblyInfo.cs
の方が直感的」
可読性や変更のしやすさを考えると、AssemblyInfo.cs
の方が楽な場合も多いので、
AssemblyInfo.cs
を活用するのも十分アリな選択です。