Moderne Revit Add-in-Entwicklung (Teil 1)

Moderne Revit Add-in-Entwicklung (Teil 1)

In diesem dreiteiligen Post möchte ich Ihnen die Vorteile einer modernen Revit Add-in Entwicklung näher bringen. Themen sind u.a. die Vorteile des neuen Visual Studio Projekt Formats, der Einsatz von IoC-Containern sowie Lösungsansätze bei Add-in-übergreifenden Versionskonflikten bei der Verwendung von 3rd-Party Software-Bibliotheken.

Aktuelle Entwicklung mit .NET 4.8

Seit der Version 2021 unterstützt Revit die Add-in Entwicklung mit .NET Framework v4.8. Dies ist die letzte Version aus der .NET Framework Reihe. Der .NET Framework Nachfolger .NET 5+ (.NET 5 und neuere Versionen) wird von der Revit API derzeit nicht unterstützt.

Mit der Einführung des neuen .NET wurde auch das Projekt-Format für Visual Studio Projekte erneuert. Dieses neue Format ist auch unter dem Namen "SDK Style Projekt" bekannt und bietet gegenüber dem alten Format zahlreiche Vorteile:

  • Übersichtlichkeit
    Das neue Format benötigt keine Liste der zum Projekt gehörenden Dateien. Es reicht aus, die Dateien in den Projektordner oder einen Unterordner zu legen. Die Dateien werden dann automatisch beim Build brücksichtigt.

  • Bessere Integration von Nuget-Packages
    Das neue Projektformat unterstützt Package-Referenzen. In der Projektdatei werden nur die direkt referenzierten Packages gelistet, während im alten Format auch sämtliche Abhängigkeiten eingetragen werden müssen. Zur Verwaltung der Packages wird zusätzlich noch eine Datei mit dem Namen package.config benötigt. Auch dies entfällt bei der Verwendung des neuen Formts.

  • Auto Reload
    Projektdateien im neuen Format können durch einen Doppelklick auf den Projekteintrag im Solution-Explorer direkt im Visual Studio geöffnet und modifiziert werden. Änderungen an der Datei werden beim Speichern sofort neu geladen. Das vorherige Entladen der Projektdatei entfällt somit.

Erstellen eines Projekts im neuen Format

Leider hat Microsoft darauf verzichtet, im Visual Studio Templates für ,NET Framework Projekte im neuen Format bereitzustellen. Ich möchte Ihnen daher hier zeigen, wie Sie dennoch auf einfache Art .NET Framework Projekte im neuen Format erstellen können. Gehen Sie dazu wie folgt vor:

Erstellen Sie im Visual Studio ein neues Projekt. Wählen Sie unter Projekt-Template "Class Library" aus. Achten Sie dabei bitte darauf, dass Sie nicht das Template "Class Library (.NET Framework) auswählen. Sie würden dann wieder ein Projekt im alten Format erzeugen. Geben Sie nach der Auswahl des Templates den Namen und den Speicherort für das Projekt an und wählen Sie im nächsten Schritt als Framework ".NET Standard 2.0" aus. Erstellen Sie nun das Projekt und öffnen Sie dann mit einem Doppelklick auf den Projekteintrag im Solution-Explorer die Projektdatei.

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

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

</Project>

Sie können nun einfach das Ziel-Framework ändern, indem Sie im Element TargetFramework den Wert netstandard2.0 durch net48 ersetzen und die Datei speichern. Nach der Änderung des Zielframeworks muss Visual Studio einige Framework-Referenzen neu laden. Dies geschieht nicht automatisch und der einfachste Weg, dies zu erzwingen, ist es, einen Restore der Packages durchzuführen. Dieser Schritt ist auch dann erforderlich, wenn Sie dem Projekt noch gar keine Packages hinzugefügt haben. Alternativ können Sie auch das Projekt entladen und anschließend wieder laden.

Um die neuesten C# Sprach-Features zuverwenden und um eigene WPF-Oberflächen zu erstellen, können Sie die Projektdatei noch wie folgt anpassen.

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

  <PropertyGroup>
    <TargetFramework>net48</TargetFramework>
	  <UseWPF>true</UseWPF>
	  <LangVersion>latest</LangVersion>
	  <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

Für Bestandsprojekte gibt es eine Anleitung zur Migration bestehender Projekte. In vielen Fällen ist es jedoch am einfachsten, zunächst eine Projektdatei im neuen Format zu erstellen und anschließend die alte Datei durch diese zu ersetzen.

Assembly-Info

Bestandteil von .NET Framework-Projekten ist die Datei AssemblyInfo.cs, in welcher u.a. Versionsnummern, Copyright-Hinweise sowie weitere Informationen zum Produkt oder zum Hersteller hinterlegt werden können. Grundsätzlich ist die Verwendung dieser Datei auch in Projekten im neuen Format möglich, ich empfehle jodoch, auf diese Datei zu verzichten. Stattdessen können alle erforderlichen Informationen entweder direkt in der Projektdatei hinterlegt oder in automatisierten Build-Prozessen übergeben werden.

Package Referenzen

Nuget Packages können auch in Projekten im alten Format hinzugefügt werden. Dabei werden sämtliche Packages sowie alle Abhängigkeiten in der Datei package.config verwaltet. Die Projektdatei selbst enthält zudem noch die Referenzen auf die Assemblies selbst.

package.config:

<packages>
  <package id="Scotec.Extensions.Linq" version="0.9.3" targetFramework="net472" />
  <package id="Scotec.Math" version="0.9.3" targetFramework="net472" />
</packages>

.csproj:

    <Reference Include="Scotec.Extensions.Linq, Version=0.9.3.0, Culture=neutral, processorArchitecture=MSIL">
      <HintPath>packages\Scotec.Extensions.Linq.0.9.3\lib\netstandard2.0\Scotec.Extensions.Linq.dll</HintPath>
    </Reference>
    <Reference Include="Scotec.Math, Version=0.9.3.0, Culture=neutral, processorArchitecture=MSIL">
      <HintPath>packages\Scotec.Math.0.9.3\lib\netstandard2.0\Scotec.Math.dll</HintPath>
    </Reference>

Visual Studio stellt eine Funktion zur Migration der package.config bereit. Beim Ausführen dieser Funktion werden die in der Projektdatei enthaltenen Assembly-Referenzen in Package-Referenzen umgewandelt. Da die Packages von nun an in der Projektdatei verwaltet werden, wird die Datei package.config nach dem Abschluss der Migration gelöscht. Bei der Migration werden lediglich die Package-Referenzen in die Projektdatei eingetragen. Eine automatische Umstellung auf das neue Format erfolgt nicht. Sie können dies aber gerne als Zwischenschritt betrachten und die hier erstellten Package-Referenzen in Ihre neue Projektdatei kopieren.

Package-Referenzen:

  <ItemGroup>
    <PackageReference Include="Scotec.Extensions.Linq">
      <Version>0.9.3</Version>
    </PackageReference>
    <PackageReference Include="Scotec.Math">
      <Version>0.9.3</Version>
    </PackageReference>
  </ItemGroup>

Fazit

Das neue Projektformat bietet gegenüber seinem Vorgänger zahlreiche Verbesserung. Hervorzuheben sind in jedem Fall die bessere Übersichtlichkeit sowie die gelungene Integration von Nuget Package-Referenzen. Projektdateien im neuen Format wirken aufgeräumter und übersichtlicher. Damit verbunden ist eine leichtere und bessere Wartbarkeit. Die Umstellung auf das neue Projektformat ist auch in Bestandsprojekten empfehlenswert, aber hierbei müssen auch Faktoren wie Zeitaufwand und Kosten für die Umstellung mit einbezogen werden. Sollten jedoch größere Änderungen oder Erweiterungen in Ihrem Projekt anstehen, sollten Sie in diesem Rahmen auch auf das neue Projektformat umstellen.

An error has occurred. This application may no longer respond until reloaded. An unhandled exception has occurred. See browser dev tools for details. Reload 🗙