dotnet core / csprojのAssemblyInfoに相当


236

dotnetコアが.csprojフォーマットに戻ったので、自動生成MyProject.AssemblyInfo.csされた新しいものが他にもあります。

[assembly: AssemblyCompany("MyProject")]
[assembly: AssemblyVersion("1.0.0.0")]

これはビルドごとに自動的に再生成されることに注意しください。以前は/ obj /ディレクトリでファイルが見つかりましたが、ファイルがディスク上で見つからず、エラーメッセージをクリックしてもファイルが開かないため、メモリにのみ存在するようになりました。

これはエラーメッセージです。 ここに画像の説明を入力してください

それらはそこで定義されているので、私はクラシックで自分で定義することはできませんAssemblyInfo.cs

プロジェクトの会社とバージョンをどこでどのように定義できますか?


5
これはドットネットコアに厳密に関連しているわけではないことに注意してください。これは、新しい.csprojベースの形式にかなり関連しています。古い.NET Frameworkをターゲットにして、この新しい.csproj形式を使用しても問題ありません。たとえば、net461
Jim Aho

回答:


334

すでにお気づきのとおり、これらの設定のほとんどは.csprojで制御できます。

これらをAssemblyInfo.csに保持する場合は、自動生成されたアセンブリ属性をオフにできます。

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup> 

内部で何が行われているのかを確認したい場合は、Microsoft.NET.Sdk内のMicrosoft.NET.GenerateAssemblyInfo.targets を確認してください。


41
この機能をオフにできることをうれしく思います。昔ながらの呼び方をしますが、自動生成された.netcoreのファイルよりも古き良きAssemblyInfo.csファイルを好みます。さらに、外部ツールを使用して、バージョンと他のAssembyInfoエントリの内容を管理しています。カスタムターゲットを使用してプロパティをプロジェクト自体に含めないようにしようとしましたが、しばらく窒息しました。
Ivaylo Slavov

1
こっちも一緒。新しいcsprojベースのシステムでは、レガシーツールを使用できませんでした。このプロパティを使用すると、戻ることができます。
Structed

5
NuGetはAssemblyInfo.csを読み取りません。MSBuildプロパティを使用してNuGetパッケージのバージョンを定義する必要があります。
natemcmaster 2017

6
ファイルが自動生成されたときに、新しいcsproj形式でInternalsVisibleTo属性を設定する方法
Shubhan 2017

8
@Shubhanこれは自動生成された属性の1つではありません。プロジェクトのどこかに空の.csファイルを作成し、それにInternalsVisibleToコードを追加します
natemcmaster

128

これらの設定は.csprojファイルに移動されました。

デフォルトでは表示されませんが、Visual Studio 2017のプロジェクトプロパティPackageタブでそれらを見つけることができ ます。

プロジェクトプロパティ、タブパッケージ

保存すると、これらの値は MyProject.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net461</TargetFramework>
    <Version>1.2.3.4</Version>
    <Authors>Author 1</Authors>
    <Company>Company XYZ</Company>
    <Product>Product 2</Product>
    <PackageId>MyApp</PackageId>
    <AssemblyVersion>2.0.0.0</AssemblyVersion>
    <FileVersion>3.0.0.0</FileVersion>
    <NeutralLanguage>en</NeutralLanguage>
    <Description>Description here</Description>
    <Copyright>Copyright</Copyright>
    <PackageLicenseUrl>License URL</PackageLicenseUrl>
    <PackageProjectUrl>Project URL</PackageProjectUrl>
    <PackageIconUrl>Icon URL</PackageIconUrl>
    <RepositoryUrl>Repo URL</RepositoryUrl>
    <RepositoryType>Repo type</RepositoryType>
    <PackageTags>Tags</PackageTags>
    <PackageReleaseNotes>Release</PackageReleaseNotes>
  </PropertyGroup>

ファイルエクスプローラーのプロパティ情報タブでFileVersionは、「ファイルバージョン」とVersion表示され、「製品バージョン」と表示されます。


1
プロジェクトタイプがの場合、プロジェクトプロパティの設定が欠落しているようですClass Library (.NET Standard)。なぜか分かりますか?バージョン15.1、リリース26403.7、コミュニティエディションを使用しています。
ベンティセ2017

2
クラスライブラリ(.NET標準)を使用しており、[パッケージ]タブに表示されます。そこで見えますか?デフォルト以外のものを「保存」すると、csprojに表示されます。
tofutim 2017年

3
パッケージタブを使用する場合、1.0。*。*のようなワイルドカードをどのように使用しますか?
Soenhay、2018

@Soenhay、ワイルドカードはパッケージバージョンを定義するときにあまり意味がなく、パッケージバージョンを使用するときにのみ意味があります。
ポールハッチャー

@Soenhay私の理解では、サードパーティのツールで同様の機能を使用しない限り、あなたはできないということです。
hultqvist

115

.NET Standard 2.0プロジェクトに対して次のことを行います。

Directory.Build.propsファイルを作成し(たとえば、リポジトリのルートに)、共有するプロパティを.csprojファイルからこのファイルに移動します。

MSBuildはそれを自動的に取得し、自動生成されたに適用しますAssemblyInfo.cs

またdotnet pack、Visual Studio 2017でUI を使用して、またはUIを介してビルドするときに、それらはnugetパッケージに適用されます。

https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-buildを参照してください


12
これはより多くの賛成票を獲得するはずです。自動生成を許可するのに便利ですが、ソリューション全体でいくつかのものを共有します
Dan

@Dan同意しました。これは他の回答よりはるかに低いため、ほとんどの人はこれを読んでいないのではないかと思います。
Lunyx

1
@Justin、プロジェクトファイル内では表示されません。結果のビルドされたアセンブリに適用されます。
pfx

1
msbuildを使用しない私たちについてはどうですか?
ジョーフィリップス

1
これは素晴らしい答えでした。ありがとうございました。いくつかのNuGetパッケージを生成する大きなソリューションで使用しました。これは、新しいSDKスタイルプロジェクトの古いアセンブリ情報の優れた代替手段です
David Anderson

57

独自のAssemblyInfo.csをいつでも追加できます。これはInternalsVisibleToAttributeCLSCompliantAttributeやその他の自動的に生成されない場合に便利です。

プロジェクトへのAssemblyInfo.csの追加

  1. ソリューションエクスプローラーで、を右クリックし<project name> > Add > New Folderます。

新しいフォルダを追加

  1. フォルダに「プロパティ」という名前を付けます。

名前フォルダーのプロパティ

  1. 「プロパティ」フォルダを右クリックし、をクリックしますAdd > New Item...

新しいアイテムを追加

  1. 「クラス」を選択し、「AssemblyInfo.cs」という名前を付けます。

名前ファイルAssemblyInfo.cs

自動生成属性の抑制

属性を自動生成するのではなく、AssemblyInfo.csに戻したい場合は、natemcmasterが回答で指摘したように、MSBuildで属性を抑制できます


1
NightOwl888に感謝します。これが私が探している答えです。
Juniuz

3
最近は誰もがVisual Studioを持っているとは思いませんが、他のエディターを使用してこの答えを理解するのが難しい人がいます(たとえば、Jetbrains Riderを使用してMac / Monoでこれを行っています)
PandaWood

自動化されたビルドが引き続きビルド番号を変更するように機能できるように、新しいMicrosoftリードはAssemblyInfo.csでうまく機能するものを維持することを検討する必要がある場合があります。
justdan23

6

NightOwl888の答えに加えて、さらに一歩進んAssemblyInfoで、単なるクラスではなくクラスを追加できます。

ここに画像の説明を入力してください


5
ネットスタンダード1.1プロジェクトのVS2019でこのダイアログを開いたときに、「アセンブリ情報ファイル」がありません。
SwissCoder

これを投稿してくれてありがとう!私は.NET Core 3.1を使用していますが、それはそこにありました!すべての主要なデフォルトパーツを追加します。
justdan23

6

このトピック/回答を次のように拡張したいと思います。誰かが述べたように、この自動生成されたAssemblyInfoは外部ツールの障害になる可能性があります。私の場合、FinalBuilderを使用して、AssemblyInfoがビルドアクションによって更新されないという問題がありました。どうやら、FinalBuilderAssemblyInfoの~proj場所を見つけるためにファイルに依存しています。プロジェクトフォルダーの下のどこかを見ていると思いました。いいえ、これを変更します

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup> 

仕事の半分しかしませんでした。VSIDE / MSビルドでビルドした場合、カスタムアセンブリ情報が許可されました。しかし、アセンブリ情報ファイルを手動で操作せずに、FinalBuilderでもそれを実行する必要がありました。MSBuild / VSとFinalBuilderのすべてのプログラムを満足させる必要がありました。

既存のものにエントリを追加することでこれを解決しました ItemGroup

<ItemGroup>
   <Compile Remove="Common\**" />
   <Content Remove="Common\**" />
   <EmbeddedResource Remove="Common\**" />
   <None Remove="Common\**" />
   <!-- new added item -->
   <None Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

これで、このアイテムを持つFinalBuilderは、AssemblyInfoの場所を見つけてファイルを変更します。アクションでNoneはMSBuild / DevEnvが許可されますが、このエントリは無視さCompileれ、projファイル内のアセンブリ情報エントリに通常付属するアクションに基づくエラーは報告されなくなります。

C:\ Program Files \ dotnet \ sdk \ 2.0.2 \ Sdks \ Microsoft.NET.Sdk \ build \ Microsoft.NET.Sdk.DefaultItems.targets(263,5):error:Duplicate 'Compile' items was included。.NET SDKには、デフォルトでプロジェクトディレクトリの「コンパイル」アイテムが含まれています。これらのアイテムをプロジェクトファイルから削除するか、プロジェクトファイルに明示的に含める場合は、 'EnableDefaultCompileItems'プロパティを 'false'に設定します。詳細については、https://aka.ms/sdkimplicititemsを参照してください。重複したアイテムは次のとおりです: 'AssemblyInfo.cs'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.