Guardar valores en la aplicaci贸n .Net en la fase de construcci贸n

Era necesario que al compilar la aplicaci贸n pasara un conjunto de constantes para usar en tiempo de ejecuci贸n. Por ejemplo, queremos "coser" en la aplicaci贸n algunos valores de cadena que se conocer谩n en el momento del ensamblaje.

En el mundo de C ++, resolv铆 esas cosas de manera muy simple usando las opciones de definici贸n y compilaci贸n. Pero en .Net define no tiene valores distintos de verdadero / falso, es decir est谩n identificados o no. Seg煤n tengo entendido, su objetivo es la compilaci贸n condicional m谩s simple.

A qui茅n le importa la soluci贸n, bienvenido a cat.

El primer pensamiento que me visit贸 fue generar un archivo con constantes por plantilla frente a la compilaci贸n, pero me gustar铆a hacerlo sin involucrar artiller铆a pesada de motores de plantillas.

Despu茅s de algunas b煤squedas, descubr铆 un hecho interesante. .Net tiene un mecanismo de atributo. Estos atributos pueden aferrarse a clases, m茅todos, campos y todo tipo de entidades diferentes. Result贸 que se puede conectar a todo el conjunto.

En los archivos de proyecto (.csproj), es posible establecer valores para estos atributos durante el ensamblaje. Y en MSBuild, puede pasar par谩metros desde el exterior a trav茅s del mecanismo de propiedades. Parece que todo encaja, tienes que intentarlo.

Cree una nueva aplicaci贸n de consola:

% mkdir Example && cd Example
% dotnet new console

Creamos el archivo ExampleAttribute.cs con la definici贸n de nuestro atributo.

using System;

namespace Example
{

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

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

A continuaci贸n, el archivo Example.csproj se reduce al siguiente formulario. Agregu茅 comentarios para que la esencia de los cambios fuera clara.

<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>

Bueno, en realidad, obtener el valor en tiempo de ejecuci贸n en 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}'");
        }
    }
}

Entonces, nos reuniremos y correremos para ver lo que tenemos.

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

Y ahora con el par谩metro:

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

Voila, el objetivo se ha logrado. Uso en salud.

All Articles