Setara dengan AssemblyInfo di dotnet core / csproj

236

Sejak inti dotnet pindah kembali ke .csprojformat ada autogenerated baru MyProject.AssemblyInfo.csyang berisi antara lain.

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

Perhatikan bahwa ini secara otomatis dibuat ulang setiap bangunan. Sebelumnya file ditemukan di direktori / obj /, sekarang tampaknya hanya dalam memori karena file tidak dapat ditemukan pada disk dan mengklik pesan kesalahan tidak membuka file apa pun.

Ini adalah pesan kesalahan: masukkan deskripsi gambar di sini

Karena mereka didefinisikan di sana saya tidak dapat mendefinisikannya sendiri dalam klasik AssemblyInfo.cs.

Di mana / bagaimana saya bisa mendefinisikan Perusahaan dan Versi proyek?

hultqvist
sumber
5
Perhatikan bahwa ini tidak sepenuhnya terkait dengan dotnet core. Ini agak terkait dengan format berbasis .csproj baru. Tidak apa-apa menggunakan format .csproj baru ini dengan menargetkan .NET Framework lama, misalnya net461
Jim Aho

Jawaban:

334

Seperti yang sudah Anda perhatikan, Anda dapat mengontrol sebagian besar pengaturan ini dalam .csproj.

Jika Anda lebih suka menyimpan ini di AssemblyInfo.cs, Anda dapat mematikan atribut perakitan yang dibuat secara otomatis.

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

Jika Anda ingin melihat apa yang terjadi di bawah tenda, checkout Microsoft.NET.GenerateAssemblyInfo.targets di dalam Microsoft.NET.Sdk.

natemcmaster
sumber
41
Senang melihat bahwa saya dapat mematikan hal ini. Panggil saya kuno, tapi saya lebih suka file AssemblyInfo.cs tua yang bagus daripada yang di-autogenerasi dari .netcore. Selain itu saya menggunakan perkakas eksternal untuk mengelola versi saya dan konten entri AssembyInfo lainnya. Saya mencoba menggunakan target khusus untuk menjaga properti saya keluar dari proyek itu sendiri tetapi itu membuat saya tersedak untuk sementara waktu.
Ivaylo Slavov
1
Sama disini. Dengan sistem berbasis csproj baru, saya tidak bisa menggunakan perangkat warisan saya. Dengan properti ini, saya sekarang dapat kembali, yang saya suka!
Structed
5
NuGet tidak membaca AssemblyInfo.cs. Anda masih harus menggunakan properti MSBuild untuk mendefinisikan versi paket NuGet.
natemcmaster
6
ketika file dihasilkan secara otomatis, bagaimana cara mengatur atribut InternalsVisibleTo dalam format csproj yang baru?
Shubhan
8
@ Syubhan ini bukan salah satu atribut yang dibuat secara otomatis. Buat file .cs kosong di suatu tempat di proyek Anda dan tambahkan kode InternalsVisibleTo ke sana
natemcmaster
128

Pengaturan tersebut telah pindah ke file .csproj.

Secara default mereka tidak muncul tetapi Anda dapat menemukannya dari Visual Studio 2017 di Packagetab properti proyek .

Properti proyek, Paket tab

Setelah disimpan, nilai-nilai itu dapat ditemukan di 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>

Di tab informasi properti explorer file, FileVersionditampilkan sebagai "Versi File" dan Versionditampilkan sebagai "Versi produk"

hultqvist
sumber
1
Pengaturan di properti proyek tampaknya tidak ada jika jenis proyek saya Class Library (.NET Standard). Apakah Anda tahu mengapa? Saya menggunakan Versi 15.1, Rilis 26403.7, Edisi Komunitas.
ventiseis
2
Saya menggunakan Class Library (.NET Standard) dan melihatnya di tab Paket. Apakah kamu melihatnya di sana? Setelah Anda "Simpan" sesuatu selain dari default, itu akan muncul di csproj.
tofutim
3
Bagaimana Anda menggunakan wildcard seperti 1.0. *. * Saat menggunakan tab paket?
Soenhay
@Soenhay, wildcarding tidak masuk akal saat mendefinisikan versi paket, hanya saat mengkonsumsinya.
Paul Hatcher
@ Jadi, pengertian saya adalah Anda tidak bisa kecuali Anda menggunakan fitur serupa di alat pihak ketiga.
hultqvist
115

Saya melakukan hal berikut untuk proyek .NET Standard 2.0 saya.

Buat Directory.Build.propsfile (misalnya di root repo Anda) dan pindahkan properti untuk dibagikan dari .csprojfile ke file ini.

MSBuild akan mengambilnya secara otomatis dan menerapkannya pada autogenerated AssemblyInfo.cs.

Mereka juga bisa diterapkan ke paket nuget ketika membangun satu dengan dotnet packatau melalui UI di Visual Studio 2017.

Lihat https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build

pfx
sumber
12
Ini harus mendapatkan lebih banyak upvote, bagus untuk memungkinkan otomatis dihasilkan tetapi masih berbagi beberapa hal di seluruh solusi
Dan
@Dan Setuju, ini jauh di bawah jawaban lain yang saya curigai kebanyakan orang akhirnya tidak membaca ini.
Lunyx
1
@ Justin, Anda tidak akan melihatnya di dalam file proyek Anda; mereka diterapkan pada majelis dibangun yang dihasilkan.
pfx
1
Bagaimana dengan kita yang tidak menggunakan msbuild?
Joe Phillips
1
Ini jawaban yang bagus. Terima kasih. Digunakan dalam solusi besar kami yang menghasilkan beberapa paket NuGet dan ini adalah alternatif yang bagus untuk info perakitan lama untuk proyek
David Anderson
57

Anda selalu dapat menambahkan AssemblyInfo.cs Anda sendiri , yang berguna untuk InternalsVisibleToAttribute, CLSCompliantAttributedan orang lain yang tidak dihasilkan secara otomatis.

Menambahkan AssemblyInfo.cs ke Proyek

  1. Di Solution Explorer, klik kanan pada <project name> > Add > New Folder.

Tambahkan Folder Baru

  1. Beri nama folder "Properti".

Properti folder nama

  1. Klik kanan pada folder "Properties", dan klik Add > New Item....

Tambahkan Item Baru

  1. Pilih "Kelas" dan beri nama "AssemblyInfo.cs".

Beri nama file AssemblyInfo.cs

Menekan Atribut-Atribut Otomatis

Jika Anda ingin memindahkan atribut Anda kembali ke AssemblyInfo.cs alih-alih membuatnya dihasilkan secara otomatis, Anda dapat menekannya di MSBuild seperti yang ditunjukkan natemcmaster dalam jawabannya .

NightOwl888
sumber
1
Terima kasih NightOwl888, ini adalah jawaban yang saya cari.
Juniuz
3
Saya akan menghindari anggapan semua orang memiliki Visual Studio hari ini, ada editor lain yang dapat digunakan membuat beberapa jawaban ini sulit untuk diikuti (misalnya saya melakukan ini pada Mac / Mono menggunakan Jetbrains Rider)
PandaWood
Terkadang, prospek Microsoft baru harus mempertimbangkan menjaga apa yang berfungsi dengan baik dengan AssemblyInfo.cs sehingga pembuatan otomatis masih dapat berfungsi untuk memodifikasi angka pembuatan.
justdan23
6

Menambah jawaban NightOwl888, Anda dapat melangkah lebih jauh dan menambahkan AssemblyInfokelas daripada hanya kelas biasa:

masukkan deskripsi gambar di sini

datchung
sumber
5
Tidak ada "File Informasi Perakitan" ketika saya membuka dialog ini di VS2019 untuk Proyek netstandard 1.1.
SwissCoder
Terima kasih telah memposting ini! Saya menggunakan .NET Core 3.1 dan itu ada di sana! Ini menambahkan semua bagian standar utama.
justdan23
6

Saya ingin memperluas topik ini / jawaban dengan yang berikut ini. Seperti yang disebutkan seseorang, AssemblyInfo yang dibuat secara otomatis ini dapat menjadi penghambat bagi alat eksternal. Dalam kasus saya, menggunakan FinalBuilder , saya punya masalah bahwa AssemblyInfo tidak diperbarui dengan membangun tindakan. Rupanya, FinalBuilder bergantung pada ~projfile untuk menemukan lokasi AssemblyInfo . Saya pikir, itu mencari di mana saja di bawah folder proyek. Tidak. Jadi, ubah ini

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

hanya melakukan setengah pekerjaan, itu memungkinkan info perakitan khusus jika dibangun oleh VS IDE / MS Build. Tapi saya perlu FinalBuilder melakukannya juga tanpa manipulasi manual untuk file info perakitan. Saya harus memenuhi semua program, MSBuild / VS dan FinalBuilder.

Saya memecahkan ini dengan menambahkan entri ke yang sudah ada ItemGroup

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

Sekarang, setelah memiliki item ini, FinalBuilder menemukan lokasi AssemblyInfo dan memodifikasi file. Sementara tindakan Nonememungkinkan MSBuild / DevEnv mengabaikan entri ini dan tidak lagi melaporkan kesalahan berdasarkan Compiletindakan yang biasanya disertai dengan entri Info Perakitan dalam projfile.

C: \ Program Files \ dotnet \ sdk \ 2.0.2 \ Sdks \ Microsoft.NET.Sdk \ build \ Microsoft.NET.Sdk.DefaultItems.targets (263,5): kesalahan: Duplikat item 'Kompilasi' dimasukkan. .NET SDK menyertakan item 'Kompilasi' dari direktori proyek Anda secara default. Anda dapat menghapus item-item ini dari file proyek Anda, atau mengatur properti 'EnableDefaultCompileItems' menjadi 'false' jika Anda ingin secara eksplisit memasukkannya dalam file proyek Anda. Untuk informasi lebih lanjut, lihat https://aka.ms/sdkimplicititems . Item duplikat adalah: 'AssemblyInfo.cs'

TS
sumber