Programing

어셈블리 속성을 사용하는 가장 좋은 방법은 무엇입니까?

lottogame 2020. 6. 3. 08:00
반응형

어셈블리 속성을 사용하는 가장 좋은 방법은 무엇입니까?


여러 프로젝트가있는 솔루션이 있습니다. 솔루션 전체 어셈블리 정보 파일 하나를 연결하여 AssemblyInfo.cs 파일을 최적화하려고합니다. 이를위한 모범 사례는 무엇입니까? 솔루션 전체 파일에 어떤 속성이 있어야하며 프로젝트 / 조립품에 특정한 속성은 무엇입니까?


편집 : 관심이 있다면 후속 질문 이 있습니다. AssemblyVersion, AssemblyFileVersion 및 AssemblyInformationalVersion의 차이점은 무엇입니까?


GlobalAssemblyInfo.cs라는 전역 파일과 AssemblyInfo.cs라는 로컬 파일을 사용하고 있습니다. 글로벌 파일에는 다음과 같은 속성이 있습니다.

 [assembly: AssemblyProduct("Your Product Name")]

 [assembly: AssemblyCompany("Your Company")]
 [assembly: AssemblyCopyright("Copyright © 2008 ...")]
 [assembly: AssemblyTrademark("Your Trademark - if applicable")]

 #if DEBUG
 [assembly: AssemblyConfiguration("Debug")]
 #else
 [assembly: AssemblyConfiguration("Release")]
 #endif

 [assembly: AssemblyVersion("This is set by build process")]
 [assembly: AssemblyFileVersion("This is set by build process")]

로컬 AssemblyInfo.cs에는 다음 속성이 포함되어 있습니다.

 [assembly: AssemblyTitle("Your assembly title")]
 [assembly: AssemblyDescription("Your assembly description")]
 [assembly: AssemblyCulture("The culture - if not neutral")]

 [assembly: ComVisible(true/false)]

 // unique id per assembly
 [assembly: Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]

다음 절차를 사용하여 GlobalAssemblyInfo.cs를 추가 할 수 있습니다.

  • 프로젝트의 상황에 맞는 메뉴에서 추가 / 기존 항목 ...선택 하십시오.
  • GlobalAssemblyInfo.cs를 선택하십시오.
  • 오른쪽에있는 작은 아래쪽 화살표를 클릭하여 추가 단추를 확장하십시오.
  • 버튼 드롭 다운 목록에서 "링크로 추가"를 선택하십시오.

제 경우에는 자체 프로젝트에 다양한 구성 요소가있는 Visual Studio 솔루션이있는 제품을 만들고 있습니다. 공통적 인 속성이 있습니다. 이 솔루션에는 약 35 개의 프로젝트와 다음과 같은 특성을 가진 공통 어셈블리 정보 (CommonAssemblyInfo.cs)가 있습니다.

[assembly: AssemblyCompany("Company")]
[assembly: AssemblyProduct("Product Name")]
[assembly: AssemblyCopyright("Copyright © 2007 Company")]
[assembly: AssemblyTrademark("Company")]

//This shows up as Product Version in Windows Explorer
//We make this the same for all files in a particular product version. And increment it globally for all projects.
//We then use this as the Product Version in installers as well (for example built using Wix).
[assembly: AssemblyInformationalVersion("0.9.2.0")]

AssemblyTitle, AssemblyVersion 등과 같은 다른 속성은 어셈블리별로 제공합니다. 어셈블리를 빌드 할 때 AssemblyInfo.cs와 CommonAssemblyInfo.cs가 각 어셈블리에 내장되어 있습니다. 이를 통해 모든 프로젝트에 공통적 인 속성을 부여하고 다른 프로젝트에 대해서는 특정 가치를 부여 할 수 있습니다.

희망이 도움이됩니다.


@JRoppert가 제시 한 솔루션은 내가하는 것과 거의 동일합니다. 유일한 차이점은 로컬 AssemblyInfo.cs 파일에 다음과 같은 줄을 넣는 것입니다. 각 어셈블리마다 다를 수 있습니다.

#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyVersion("This is set by build process")]
[assembly: AssemblyFileVersion("This is set by build process")]
[assembly: CLSCompliant(true)]

또한 하나의 솔루션이 단일 제품 라인 / 릴리스 가능한 제품이라는 가정하에 솔루션 당 하나의 공통 어셈블리 정보를 (일반적으로) 사용합니다. 공통 어셈블리 정보 파일에는 다음이 포함됩니다.

[assembly: AssemblyInformationalVersion("0.9.2.0")]

Windows 탐색기에 표시되는 "ProductVersion"값을 설정합니다.


MSBuild Community Tasks contains a custom task called AssemblyInfo which you can use to generate your assemblyinfo.cs. It requires a little hand-editing of your csproj files to use, but is worthwhile.


In my opinion using a GlobalAssemblyInfo.cs is more trouble than it's worth, because you need to modify every project file and remember to modify every new project, whereas you get an AssemblyInfo.cs by default.

For changes to global values (i.e. Company, Product etc) the changes are usually so infrequent and simple to manage I don't think DRY should be a consideration. Just run the following MSBuild script (dependent on the MSBuild Extension Pack) when you want to manually change the values in all projects as a one-off:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="UpdateAssemblyInfo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <AllAssemblyInfoFiles Include="..\**\AssemblyInfo.cs" />
    </ItemGroup>

    <Import Project="MSBuild.ExtensionPack.tasks" />

  <Target Name="UpdateAssemblyInfo">
    <Message Text="%(AllAssemblyInfoFiles.FullPath)" />
    <MSBuild.ExtensionPack.Framework.AssemblyInfo 
        AssemblyInfoFiles="@(AllAssemblyInfoFiles)"
        AssemblyCompany="Company"
        AssemblyProduct="Product"
        AssemblyCopyright="Copyright"
        ... etc ...
        />
  </Target>

</Project>

To share a file between multiple projects you can add an existing file as a link.

To do this, add an existing file, and click on "Add as Link" in the file selector.Add As Link
(source: free.fr)

As for what to put in the shared file, I would suggest putting things that would be shared across assemblies. Things like copyright, company, perhaps version.


Using a single AseemblyInfo.cs file for multiple projects is not recommended. The AssemblyInfo file includes information that might be relevant only for that specific assembly. The two most obvious pieces of information are the AssemblyTitle and AssemblyVersion.

A better solution might be to use targets file, which are handled by the MSBuild, in order to "inject" assembly attributes to more than one project.


One thing I have found useful is to generate the AssemblyVersion elements (etc) by applying token-substitution in the pre-build phase.

I use TortoiseSvn, and it is easy to use its SubWCRev.exe to turn a template AssemblyInfo.wcrev into AssemblyInfo.cs. The relevant line in the template might look something like this:

[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]

The third element is then the revision number. I use the fourth element to check I haven't forgotten to commit any new or changed files (the fourth element is 00 if it is all OK).

By the way, add AssemblyInfo.wcrev to your version control and ignore AssemblyInfo.cs if you use this.

참고URL : https://stackoverflow.com/questions/62353/what-are-the-best-practices-for-using-assembly-attributes

반응형