เทียบเท่ากับ AssemblyInfo ใน dotnet core / csproj


236

ตั้งแต่จุดหลักของ dotnet ย้ายกลับไปที่.csprojรูปแบบจะมีการสร้างอัตโนมัติใหม่MyProject.AssemblyInfo.csซึ่งมีในหมู่อื่น ๆ

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

โปรดทราบว่าสิ่งนี้จะถูกสร้างใหม่ทุกบิลด์โดยอัตโนมัติ ก่อนหน้านี้พบไฟล์ในไดเร็กทอรี / obj / ตอนนี้ดูเหมือนว่าจะอยู่ในหน่วยความจำเท่านั้นเนื่องจากไม่พบไฟล์บนดิสก์และการคลิกที่ข้อความแสดงข้อผิดพลาดจะไม่เปิดไฟล์ใด ๆ

นี่คือข้อความแสดงข้อผิดพลาด: ป้อนคำอธิบายรูปภาพที่นี่

AssemblyInfo.csเนื่องจากพวกเขามีการกำหนดไว้มีฉันไม่สามารถกำหนดให้ตัวเองอยู่ในคลาสสิก

ฉันจะกำหนด บริษัท และเวอร์ชันของโครงการได้ที่ไหน


5
โปรดทราบว่านี่ไม่เกี่ยวข้องกับ dotnet core อย่างเคร่งครัด นี่ค่อนข้างเกี่ยวข้องกับรูปแบบใหม่. csproj เป็นเรื่องที่ดีที่จะใช้รูปแบบ. csproj ใหม่นี้โดยกำหนดเป้าหมายเป็น. NET Framework เก่าตัวอย่างเช่น net461
Jim Aho

คำตอบ:


334

ตามที่คุณสังเกตเห็นแล้วคุณสามารถควบคุมการตั้งค่าเหล่านี้ได้ใน. csproj

หากคุณต้องการเก็บไว้ใน AssemblyInfo.cs คุณสามารถปิดแอตทริบิวต์แอสเซมบลีที่สร้างขึ้นอัตโนมัติ

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

หากคุณต้องการดูว่าเกิดอะไรขึ้นภายใต้ประทุนให้ชำระเงินMicrosoft.NET.GenerateAssemblyInfo.targetsภายใน Microsoft.NET.Sdk


41
ดีใจที่เห็นว่าฉันสามารถปิดสิ่งนี้ โทรหาฉันสมัยเก่า แต่ฉันชอบไฟล์ AssemblyInfo.cs แบบเก่าที่ดีกว่าไฟล์. netcore ที่สร้างอัตโนมัติ นอกจากนี้ฉันใช้เครื่องมือภายนอกเพื่อจัดการเวอร์ชันของฉันและเนื้อหาของรายการ AssembyInfo อื่น ๆ ฉันพยายามใช้เป้าหมายที่กำหนดเองเพื่อป้องกันไม่ให้คุณสมบัติของฉันออกจากโครงการ แต่มันทำให้ฉันรู้สึกอึดอัด
Ivaylo Slavov

1
กันที่นี่ ด้วยระบบที่ใช้ csproj ใหม่ฉันไม่สามารถใช้เครื่องมือดั้งเดิมได้ ด้วยคุณสมบัตินี้ฉันสามารถย้อนกลับไปได้ซึ่งฉันชอบ!
โครงสร้าง

5
NuGet ไม่อ่าน AssemblyInfo.cs คุณยังต้องใช้คุณสมบัติ MSBuild เพื่อกำหนดรุ่นแพ็คเกจ NuGet
natemcmaster

6
เมื่อไฟล์ถูกสร้างขึ้นโดยอัตโนมัติวิธีการตั้งค่าแอตทริบิวต์ InternalsVisibleTo ในรูปแบบ csproj ใหม่
Shubhan

8
@Shubhan นี่ไม่ใช่หนึ่งในแอตทริบิวต์ที่สร้างขึ้นโดยอัตโนมัติ สร้างไฟล์. 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>

ในแท็บข้อมูลคุณสมบัติไฟล์ explorer FileVersionจะแสดงเป็น "เวอร์ชันไฟล์" และVersionแสดงเป็น "เวอร์ชันผลิตภัณฑ์"


1
Class Library (.NET Standard)การตั้งค่าในคุณสมบัติของโครงการดูเหมือนจะหายไปหากประเภทโครงการของฉันคือ คุณมีความคิดใด ๆ ว่าทำไม? ฉันใช้เวอร์ชัน 15.1, Release 26403.7, Community Edition
ventiseis

2
ฉันใช้ Class Library (.NET Standard) แล้วดูในแท็บแพคเกจ คุณเห็นมันไหม เมื่อคุณ "บันทึก" สิ่งอื่นที่ไม่ใช่ค่าเริ่มต้นจะปรากฏใน csproj
tofutim

3
คุณใช้ wildcard เช่น 1.0. *. * เมื่อใช้แท็บแพ็คเกจได้อย่างไร
Soenhay

@Senhay การใช้สัญลักษณ์แทนไม่ได้สมเหตุสมผลมากเมื่อกำหนดรุ่นของแพคเกจเฉพาะเมื่อใช้งาน
พอลแฮทเชอ

@Senhay ความเข้าใจของฉันคือคุณไม่สามารถทำได้เว้นแต่คุณจะใช้คุณสมบัติที่คล้ายกันในเครื่องมือของบุคคลที่สาม
hultqvist

115

ฉันทำสิ่งต่อไปนี้สำหรับโครงการ. NET Standard 2.0

สร้างDirectory.Build.propsไฟล์ (เช่นในรูทของ repo ของคุณ) และย้ายคุณสมบัติที่จะแชร์จาก.csprojไฟล์ไปยังไฟล์นี้

MSBuild จะหยิบมันขึ้นมาโดยอัตโนมัติและนำพวกเขาไป AssemblyInfo.csautogenerated

พวกมันยังถูกนำไปใช้กับแพ็คเกจ nuget เมื่อสร้างด้วยdotnet packหรือผ่าน UI ใน Visual Studio 2017

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


12
นี่ควรจะได้รับการอัปโหลดเพิ่มขึ้นซึ่งดีที่อนุญาตให้สร้างอัตโนมัติ แต่ยังคงแบ่งปันบางสิ่งตลอดโซลูชัน
Dan

@Dan เห็นด้วยนี่คือต่ำกว่าคำตอบอื่น ๆ ที่ฉันสงสัยว่าคนส่วนใหญ่ก็ไม่ได้จบลงอ่านนี้
Lunyx

1
@ จัสตินคุณจะไม่เห็นพวกเขาในไฟล์โครงการของคุณ พวกมันถูกนำไปใช้กับชุดประกอบที่สร้างขึ้นมา
pfx

1
แล้วพวกเราที่ไม่ใช้ msbuild ล่ะ?
Joe Phillips

1
นี่เป็นคำตอบที่ดีมาก ขอบคุณ. ใช้ในโซลูชันขนาดใหญ่ของเราที่ผลิตแพ็คเกจ NuGet และนี่เป็นทางเลือกที่ยอดเยี่ยมสำหรับข้อมูลประกอบเก่าสำหรับโครงการสไตล์ sdk ใหม่
David Anderson

57

คุณสามารถเพิ่มของคุณเองAssemblyInfo.csซึ่งมาในการที่มีประโยชน์InternalsVisibleToAttribute, CLSCompliantAttributeและคนอื่น ๆ ที่ไม่ได้สร้างขึ้นโดยอัตโนมัติ

เพิ่ม AssemblyInfo.cs ให้กับโครงการ

  1. ในโซลูชัน Explorer <project name> > Add > New Folderคลิกขวาบน

เพิ่มโฟลเดอร์ใหม่

  1. ตั้งชื่อโฟลเดอร์ "Properties"

ชื่อโฟลเดอร์คุณสมบัติ

  1. คลิกขวาที่โฟลเดอร์ "Properties" Add > New Item...และคลิก

เพิ่มรายการใหม่

  1. เลือก "Class" แล้วตั้งชื่อว่า "AssemblyInfo.cs"

ชื่อไฟล์ AssemblyInfo.cs

การยับยั้งคุณสมบัติที่สร้างขึ้นอัตโนมัติ

หากคุณต้องการที่จะย้ายแอตทริบิวต์ของคุณกลับไปAssemblyInfo.csแทนการมีพวกเขาสร้างขึ้นโดยอัตโนมัติคุณสามารถปราบปรามพวกเขาใน MSBuild เป็น natemcmaster ชี้ให้เห็นในคำตอบของเขา


1
ขอบคุณ NightOwl888 นี่คือคำตอบที่ฉันกำลังมองหา
Juniuz

3
ฉันจะหลีกเลี่ยงสมมติว่าทุกคนมี Visual Studio วันนี้มีบรรณาธิการอื่น ๆ ที่สามารถนำมาใช้ทำให้คำตอบนี้ยากที่จะปฏิบัติตามสำหรับบางคน (เช่นฉันทำเช่นนี้บน Mac / Mono ใช้ Jetbrains ไรเดอร์)
PandaWood

บางครั้งโอกาสในการขายใหม่ของ Microsoft ควรพิจารณาว่าอะไรทำงานได้ดีกับ AssemblyInfo.cs ดังนั้นการสร้างอัตโนมัติสามารถทำงานได้เพื่อแก้ไขหมายเลขบิลด์
justdan23

6

การเพิ่มคำตอบของ NightOwl888 คุณสามารถไปอีกขั้นหนึ่งและเพิ่มAssemblyInfoคลาสได้มากกว่าคลาสธรรมดา:

ป้อนคำอธิบายรูปภาพที่นี่


5
ไม่มี "ไฟล์ข้อมูลการประกอบ" เมื่อฉันเปิดกล่องโต้ตอบนี้ใน VS2019 สำหรับโครงการ netstandard 1.1
SwissCoder

ขอบคุณสำหรับการโพสต์นี้! ฉันใช้. NET Core 3.1 และมันอยู่ที่นั่น! มันเพิ่มส่วนเริ่มต้นที่สำคัญทั้งหมด
justdan23

6

ฉันต้องการขยายหัวข้อ / คำตอบด้วยสิ่งต่อไปนี้ ดังที่มีคนพูดถึงAssemblyInfo ที่สร้างขึ้นอัตโนมัตินี้อาจเป็นอุปสรรคต่อเครื่องมือภายนอก ในกรณีของฉันใช้FinalBuilderฉันมีปัญหาที่AssemblyInfoไม่ได้รับการปรับปรุงโดยการสร้าง เห็นได้ชัดว่าFinalBuilderอาศัย~projไฟล์ที่จะหาสถานที่ตั้งของAssemblyInfo ฉันคิดว่ามันดูทุกที่ภายใต้โฟลเดอร์โครงการ ไม่เลยเปลี่ยนสิ่งนี้

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

ทำงานเพียงครึ่งเดียวจึงอนุญาตให้ข้อมูลประกอบที่กำหนดเองหากสร้างโดย VS IDE / MS Build แต่ฉันต้องการ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): ข้อผิดพลาด: รวมรายการ 'คอมไพล์' ที่ซ้ำกัน .NET SDK รวมถึงรายการ 'คอมไพล์' จากไดเรกทอรีโครงการของคุณตามค่าเริ่มต้น คุณสามารถลบรายการเหล่านี้ออกจากไฟล์โครงการของคุณหรือตั้งค่าคุณสมบัติ 'EnableDefaultCompileItems' เป็น 'false' หากคุณต้องการรวมไว้ในไฟล์โครงการของคุณ สำหรับข้อมูลเพิ่มเติมโปรดดูที่https://aka.ms/sdkimplicititems รายการที่ซ้ำกันคือ: 'AssemblyInfo.cs'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.