Menyimpan Nilai dalam Aplikasi .Net pada Tahap Build

Ada kebutuhan bagi saya ketika membangun aplikasi untuk lulus dalam set konstanta untuk digunakan pada saat runtime. Sebagai contoh, kami ingin "menjahit" ke dalam aplikasi beberapa nilai string yang akan diketahui pada saat perakitan.

Di dunia C ++, saya memecahkan hal-hal seperti itu dengan sangat sederhana menggunakan opsi define dan compiler. Namun dalam. Net define tidak memiliki nilai selain true / false, mis. mereka diidentifikasi atau tidak. Sejauh yang saya mengerti, tujuan mereka adalah kompilasi bersyarat yang paling sederhana.

Siapa yang peduli dengan solusinya, selamat datang di kucing.

Pikiran pertama yang mengunjungi saya adalah untuk menghasilkan file dengan konstanta sesuai dengan template sebelum membangun, tetapi saya ingin melakukannya tanpa melibatkan artileri berat dari mesin template.

Setelah mencari, saya menemukan fakta yang menarik. .Net memiliki mekanisme atribut. Atribut ini dapat melekat pada kelas, metode, bidang, dan segala macam entitas yang berbeda. Ternyata itu bisa dihubungkan ke seluruh majelis.

Dalam file proyek (.csproj), dimungkinkan untuk menetapkan nilai untuk atribut ini selama perakitan. Dan di MSBuild, Anda bisa melewatkan parameter dari luar melalui mekanisme properti. Tampaknya semuanya cocok, Anda harus mencoba.

Buat aplikasi konsol baru:

% mkdir Example && cd Example
% dotnet new console

Kami membuat file ExampleAttribute.cs dengan definisi atribut kami.

using System;

namespace Example
{

[AttributeUsage(AttributeTargets.Assembly)] //     
public class ExampleAttribute : Attribute
{
    public string Value { get; set; }

    public ExampleAttribute(string value)
    {
        Value = value;
    }
}
 
}

Selanjutnya, file Example.csproj dikurangi menjadi formulir berikut. Saya menambahkan komentar sehingga esensi dari perubahan itu jelas.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>Example</RootNamespace>

    <ExampleValue>default</ExampleValue> <!--        -->
  </PropertyGroup>

  <!--          -->
  <ItemGroup>
    <AssemblyAttribute Include="Example.ExampleAttribute"> <!--    -->
      <_Parameter1>$(ExampleValue)</_Parameter1> <!--      -->
    </AssemblyAttribute>
  </ItemGroup>

</Project>

Sebenarnya, mendapatkan nilai saat runtime di Project.cs

using System;
using System.Reflection;

namespace Example
{
    class Program
    {
        static void Main(string[] args)
        {
            var assembly = Assembly.GetExecutingAssembly();
            var attr = (ExampleAttribute) assembly.GetCustomAttribute(typeof(ExampleAttribute));
            Console.WriteLine($"Assembly attribute value = '{attr.Value}'");
        }
    }
}

Jadi, kita akan berkumpul dan berlari untuk melihat apa yang kita dapatkan.

% dotnet build .
% dotnet run --no-build .
Assembly attribute value = 'default'

Dan sekarang dengan parameter:

% dotnet build . /p:ExampleValue="NOT DEFAULT"
% dotnet run --no-build .
Assembly attribute value = 'NOT DEFAULT'

Voila, tujuannya telah tercapai. Gunakan untuk kesehatan.

All Articles