Visual Studio ohne Installation

Wie kann ich einen alten Compiler auf einer neuen Windows Plattform ohne Installation zum Laufen bekommen ?

Oder anders gefragt: Wie kann man Visual Studio Alt bis Uralt (z.B. 2005) in einem Docker-Container zum Arbeiten bewegen?


MSVC 2017 ist (zu) einfach …

Das Build-Tools Installationsprogramm vs_BuildTools.exe ist seit Studio 2017 Docker-fähig und deshalb gibt es eine offizielle Installationsprozedur. Ich füge dann noch GIT und CMake hinzu, damit man direkt aus der Umgebung Code herunterladen und bauen kann.
Die Programme werden einfach in das Image kopiert und danach werden per SETX die Umgebungsvariablen wie PATH angepasst.

Mein Dockerfile sieht dann etwa so aus:

 1FROM mcr.microsoft.com/windows/servercore:ltsc2016
 2
 3SHELL ["cmd", "/S", "/C"]
 4COPY ["cmake", "C:/Program Files/cmake"]
 5COPY ["Git", "C:/Program Files/Git"]
 6RUN SETX PATH "%PATH%;C:\Program Files\Git\cmd;C:\Program Files\cmake\bin"
 7RUN MKDIR C:\TEMP
 8ADD vs_BuildTools_2017.exe /TEMP/vs_buildtools.exe
 9RUN C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache \
10    --installPath C:\BuildTools \
11    --add Microsoft.VisualStudio.Workload.VCTools \
12    --add Microsoft.VisualStudio.Component.WinXP \
13        --add Microsoft.VisualStudio.ComponentGroup.NativeDesktop.WinXP \
14    --add Microsoft.VisualStudio.Component.Windows81SDK \
15    --add Microsoft.VisualStudio.Component.Windows10SDK.10580 \
16    --add Microsoft.VisualStudio.Component.Windows10SDK.14393 \
17 || IF "%ERRORLEVEL%"=="3010" EXIT 0
18
19ENTRYPOINT ["C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat", "&&", "powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"]

Aber mein geschätztes Studio 2005 für die alten NT4 und Win2K Builds lässt sich so nicht aufsetzen.

MSVC 2005 per XCOPY ausrollen

Damit man per CMake einen MSVC 2005 Build durchführen zu können, braucht man eigentlich nur folgende Zutaten:

  • CMake 3.11.4 (oder älter für MSVC 2005)
    einfach nach C:\Program Files\CMake kopieren und in den PATH aufnehmen.
  • dotNet Framework 2.0
    Wird heute per dism bereitgestellt, und zwar mit:
    dism /online /Enable-Feature /FeatureName:NetFx3ServerFeatures
    dism /online /Enable-Feature /FeatureName:NetFx3
  • Visual Studio 2005 Redistributable (X86 + X64 + Debug)
  • Studio 2005 Kopie aus Program Files (x86)
    Man installiert am besten eine vollständige MSVC 2005 in eine virtuelle Maschine und kopiert dann den Ordner C:\Program Files (x86)\Microsoft Visual Studio 8
  • Umgebungsvariable VS80COMNTOOLS
    Diese muss auf C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\ zeigen, und ganz wichtig ist der Backslash am Ende.
  • vcvarsall.bat muss ausgeführt werden.

Wenn man mit Docker arbeitet muss man sich etwas für das dism Kommando überlegen, denn das Image beinhaltet das dotNet-Installationspaket nicht. Bei meinem Server 2016 musste ich aus der Installations-CD die Datei server2016\sources\sxs\microsoft-windows-netfx3-ondemand-package.cab ins Image kopieren (z.B. nach c:\windows\temp) und dort per dism /online /Enable-Feature /FeatureName:NetFx3 /All /Source:c:\windows\temp /NoRestart integrieren lassen.

Die Visual Studio 2005 Runtime existiert als zwei Downloads: vcredist_x86.exe und vcredist_x64.exe. Beide lassen sich per Konsolenkommando start /wait path\to\vcredist_xYZ.exe /Q installieren.

Wäre da nicht CMake, das zum Bauen seiner Test-Pakete Debug-Binaries erzeugt. Denn die brauchen die Debug-Runtime und die wird offiziell nicht distribuiert und ist nur Teil einer Visual Studio Installation.
Es gibt aber einen Ausweg bzw Umweg:

Man kann einen eigenes [MSI Paket] in einen normal installierten Visual Studio 2005 erstellen, das die so genannten “Merge-Module” der Debug-Runtime beinhaltet. Ich habe mir also ein Hello-World Konsolenprogramm erstellt und einen Installer daran gehängt, der die VC80_Debug* MSM Dateien in C:\Program Files (x86)\Common Files\Merge Modules als Merge-Module hinzugefügt bekommen hat.

Und das entstandene MSI-Paket kann dann wieder einfach per start /wait msiexec /i path/to/debug-rt-inst.msi installiert werden und schon liegen die benötigten Debug-Dateien in C:\Windows\WinSXS, wo man sie sonst nur schwer in korrekter Form hinbekommt.

Fazit

Nun, die Prozedur ist jetzt mal ein experimenteller Ansatz und ich kann so auf jeden Fall per CMake erstellte NMAKE MSVC 2005 Projekte sogar im Docker auf Server 2016 bauen lassen.

MSBUILD erweist sich im Docker Container immer noch bockig und verlangt eine Neuinstallation von Visual Studio. Vermutlich fehlen Dateien oder Registry-Hacks, aber ich bin vorerst auch mit NMAKE Builds zufrieden.

In der Praxis werde ich weiter meine vollständige Studio-Installation in einer WinXP bzw. Server2003 VM nutzen, aber die Möglichkeit, dass die Installation durch ein “Fast-XCOPY” Deployment ersetzt werden kann, gefällt mir.

Mal sehen, ob sich das noch ausbauen lässt …


Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!