Speichern von Werten in einer .NET-Anwendung in der Erstellungsphase

Beim Erstellen der Anwendung musste ich eine Reihe von Konstanten zur Verwendung zur Laufzeit übergeben. Zum Beispiel möchten wir einen Zeichenfolgenwert in die Anwendung "nähen", der zum Zeitpunkt der Montage bekannt ist.

In der C ++ - Welt habe ich solche Dinge sehr einfach mit Definitions- und Compileroptionen gelöst. In .Net define gibt es jedoch keine anderen Werte als true / false, d. H. Sie werden entweder identifiziert oder nicht. Soweit ich weiß, ist ihr Ziel die einfachste bedingte Zusammenstellung.

Wer kümmert sich um die Lösung, willkommen bei Katze.

Der erste Gedanke, der mich besuchte, war, vor dem Build eine Datei mit Konstanten gemäß der Vorlage zu generieren, aber ich würde gerne auf schwere Artillerie der Vorlagen-Engines verzichten.

Nach einigem Suchen entdeckte ich eine interessante Tatsache. .Net verfügt über einen Attributmechanismus. Diese Attribute können an Klassen, Methoden, Feldern und allen möglichen Entitäten haften. Es stellte sich heraus, dass es an die gesamte Baugruppe angeschlossen werden kann.

In Projektdateien (.csproj) können während der Assemblierung Werte für diese Attribute festgelegt werden. In MSBuild können Sie Parameter von außen über den Mechanismus der Eigenschaften übergeben. Es scheint, dass alles passt, muss man versuchen.

Erstellen Sie eine neue Konsolenanwendung:

% mkdir Example && cd Example
% dotnet new console

Wir erstellen die Datei ExampleAttribute.cs mit der Definition unseres Attributs.

using System;

namespace Example
{

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

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

Als nächstes wird die Datei Example.csproj auf das folgende Formular reduziert. Ich habe Kommentare hinzugefügt, damit das Wesentliche der Änderungen klar ist.

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

Nun, eigentlich den Wert für die Laufzeit in Project.cs erhalten

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}'");
        }
    }
}

Also werden wir uns versammeln und rennen, um zu sehen, was wir haben.

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

Und jetzt mit dem Parameter:

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

Voila, das Ziel wurde erreicht. Verwendung für die Gesundheit.

All Articles