NX Open und VS Code

Inhaltsverzeichnis

Hintergrund

Üblicherweise werden NX Open-Applikationen in C# mit Microsofts Visual Studio erstellt. NX bringt Wizards zum bequemen Aufsetzen von entsprechenden Projekten mit. Wer jedoch nicht auf diese Entwicklungsumgebung zurückgreifen kann oder will, der hat mit dem quelloffenen VS Code (Visual Studio Code) eine gute Alternative.
Abgesehen vom Namen und vom Hersteller haben diese beiden Tools nur begrenzte Gemeinsamkeiten. VS Code ist in erster Linie ein Quellcodeeditor1.
Für kleine und mittlere NX Open Projekte ist jedoch das Wesentliche dabei. Insbesondere die IntelliSense-Funktionalität, die für ein produktives Arbeiten mit den zahlreichen Klassen und Methoden der NX Open-API unentbehrlich ist, entspricht der von Visual Studio.

Voraussetzungen

Neben dem eigentlichen Programm sind für die Verwendung von VS Code als Entwicklungsumgebung für NX Open-Applikationen noch zusätzliche Komponenten notwendig. Die jeweils benötigte Version dieser Komponenten hängt wesentlich von der NX-Zielversion ab. Im hier vorgestellten Beispiel ist die Zielversion NX 1899. Alle neben NX notwendigen Bestandteile sind kostenfrei verfügbar.

  • NX 1899 inkl. Programming Tools Feature
  • .NET Framework 4.6.2 Developer Pack2
  • Visual Studio Code3
  • C# for Visual Studio Code (VS Code Erweiterung)

Wenn nicht nur unkompilierte Journale erstellt werden sollen, dann muss zusätzlich der Compiler installiert werden:

  • .NET Desktop-Buildtools (Bestandteil der Buildtools für Visual Studio 20194). Von den optionalen Komponenten sollten mindesten die .NET Framework 4.6.2-Enwicklungstools installiert werden.

Details zur Verwendung von VS Code finden sich z.B. hier5. Die C# Erweiterung für VS Code kann aus dem Programm heraus installiert werden.

C# Erweiterung installieren.

VS Code und die C# Erweiterung zielen in erster Linie auf .NET Core und nicht das .NET Framework, das hier für die NX Open Entwicklung benötigt wird. Entsprechend erscheint unter Umständen eine Meldung, die auf das Fehlen des .NET Core SDKs hinweist. Diese Meldung kann ignoriert oder unterdrückt werden.

Die Meldung zum .NET Core SDK kann ignoriert werden.

Weiterhin sollte bei der Verwendung von VS Code für die NX Open Entwicklung die Umgebungsvariable UGII_BASE_DIR gesetzt sein. Dies kann über ein kleines Startskript geschehen. Hier kann auch gleich der Pfad zu den Buildtools zur PATH Variable hinzugefügt werden, falls nicht nur unkompilierte Journale erstellt werden sollen.

rem Set NX base path
set "UGII_BASE_DIR=c:\nx\NX 1899"
rem Add compiler path
set "PATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin;%PATH%"
rem Run VS Code
code 

NX Open Projekte aufsetzen

Zunächst muss für das Projekt ein neues Verzeichnis an beliebiger Stelle erzeugt und dieses Verzeichnis in VS Code geöffnet werden. Das kann in einem Schritt über File/Open Folder… und das entsprechende Kontextmenü geschehen.

Projektverzeichnis anlegen und öffnen.

Das für ein funktionierendes IntelliSense und ein mögliches Kompilieren notwendige Projektfile muss per Hand angelegt werden. Als Vorlage kann die Template-Datei des Wizards aus der NX-Installation dienen (<UGII_BASE_DIR>\UGOPEN\vs_files\VC#\VC#Wizards\ NXOpen_VCS\Templates\1033\default_dll.csproj). Die Erweiterung der neuen Datei muss csproj lauten.

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">x64</Platform>
    <ProductVersion>8.0.50727</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <!-- You may want to make this GUID unique -->
    <ProjectGuid>{ECAB86B8-89C2-4806-B397-C2B07638CFXX}</ProjectGuid>
    <!-- Use 'library' for internal NX Open program and 'exe' for external -->
    <OutputType>library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace></RootNamespace>
    <!-- Enter name of the compiled dll/exe -->
    <AssemblyName>nx_project</AssemblyName>
    <!-- Enter target framework -->
    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <Prefer32Bit>false</Prefer32Bit>
	<PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <Prefer32Bit>false</Prefer32Bit>
	<PlatformTarget>x64</PlatformTarget>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="NXOpen, Culture=neutral, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>$(UGII_BASE_DIR)\nxbin\managed\NXOpen.dll</HintPath>
	  <Private>False</Private>
    </Reference>
    <Reference Include="NXOpen.UF, Culture=neutral, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>$(UGII_BASE_DIR)\nxbin\managed\NXOpen.UF.dll</HintPath>
	  <Private>False</Private>
    </Reference>
    <Reference Include="NXOpen.Utilities, Culture=neutral, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>$(UGII_BASE_DIR)\nxbin\managed\NXOpen.Utilities.dll</HintPath>
	  <Private>False</Private>
    </Reference>
    <Reference Include="NXOpenUI, Culture=neutral, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>$(UGII_BASE_DIR)\nxbin\managed\NXOpenUI.dll</HintPath>
	  <Private>False</Private>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <!-- Add sourcefiles to include -->
    <!-- 
    <Compile Include="<source>.cs" />
    -->
  </ItemGroup>
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets"/>
</Project>
Projektverzeichnis mit Projektdatei.

Nun können eine oder mehrere Quellcodedateien zum Projekt hinzugefügt werden. Alle Dateien müssen in der Projektdatei eingetragen werden.

...
  <ItemGroup>
    <!-- Add sourcefiles to include -->
    <Compile Include="program.cs" />
  </ItemGroup>
...

Nun stehen alle Features zur Quellcodehervorhebung und zur automatischen Vervollständigung zur Verfügung.

Quellcodehervorhebung und Vervollständigung.

Kompilieren

Vor dem Kompilieren müssen die Buildtools installiert und die PATH-Umgebungsvariable entsprechend angepasst sein.

Zum Kompilieren Strg + Shift + b drücken. Falls der notwendige Build-Task noch nicht vorhanden ist, wird die Erzeugung angeboten.

Build-Task erzeugen.
JSON Konfigurationsdatei erzeugen.
Vorlage auswählen.

Im Unterordner .vscode des Projektverzeichnisses ist nun die Datei tasks.json zu finden. Diese kann nun noch nach dem folgenden Beispiel modifiziert werden.

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "msbuild debug",
            "type": "shell",
            "command": "msbuild",
            "args": [
                // Ask msbuild to generate full paths for file names.
                "/property:GenerateFullPaths=true",
                "/t:build",
                "/p:Configuration=Debug",
                // Do not generate summary otherwise it leads to duplicate errors in Problems panel
                "/consoleloggerparameters:NoSummary"
            ],
            "group": "build",
            "presentation": {
                // Reveal the output only if unrecognized errors occur.
                "reveal": "silent"
            },
            // Use the standard MS compiler pattern to detect errors, warnings and infos
            "problemMatcher": "$msCompile"
        },
        {
            "label": "msbuild release",
            "type": "shell",
            "command": "msbuild",
            "args": [
                // Ask msbuild to generate full paths for file names.
                "/property:GenerateFullPaths=true",
                "/p:Configuration=Release",
                "/t:build",
                // Do not generate summary otherwise it leads to duplicate errors in Problems panel
                "/consoleloggerparameters:NoSummary"
            ],
            "group": "build",
            "presentation": {
                // Reveal the output only if unrecognized errors occur.
                "reveal": "silent"
            },
            // Use the standard MS compiler pattern to detect errors, warnings and infos
            "problemMatcher": "$msCompile"
        }

    ]
}

Nach erneutem Drücken von Strg + Shift + b kann nun zwischen einem Debug- und einem Release-Build ausgewählt werden.

Fazit

VSCode kann mit verhältnismäßig geringem Aufwand eingerichtet und für die Entwicklung von NX Open Applikationen in C# verwendet werden. Insbesondere für unkompilierte Journale und kleinere Projekte ist es eine Alternative zu Visual Studio.

Ähnliches