J'étudie la faisabilité d'un programme de gestuelle visuelle Kinect en C#. (quelque chose comme le projet Continuous Gesture Basics https://github.com/angelaHillier/ContinuousGestureBasics-WPF) à l'intérieur d'un Docker pour les conteneurs Windows.
-
Est-ce que c'est théoriquement possible (exécuter C# Kinect dans un conteneur Docker pour Windows) ?
-
Si la réponse à la question 1 est oui, voici quelques détails supplémentaires :
J'utilise l'image microsoft/dotnet-framework:4.7 comme base et mon fichier Docker initial ressemble à ceci :
FROM microsoft/dotnet-framework:4.7
ADD . /home/gesture
WORKDIR /home/gesture
Construire l'image :
$ docker build -t kinect .
Allumer le conteneur :
$ docker run -dit --name kinectContainer kinect
S'attacher à une session powershell pour faire le tour de la question :
$ docker exec -it kinectContainer powershell
Lorsque j'essaie d'exécuter mon application gestuelle à partir du conteneur Docker, j'obtiens l'erreur suivante (ce qui est normal puisqu'aucun SDK Kinect n'a été installé dans le conteneur) :
Unhandled Exception: System.BadImageFormatException: Could not load file or assembly 'Microsoft.Kinect, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependenc
ies. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058) ---> System.BadImageFormatExcep
tion: Cannot load a reference assembly for execution. erable program. Check the spelling of the name, or if a path was included, verify that the path
--- End of inner exception stack trace ---
at GestureDetector.GestureDetectorApp..ctor()
À ce stade, la grande question est de savoir comment installer le Kinect v2 SDK [KinectSDK-v2.0_1409-Setup.exe] ou le Kinect v2 runtime [KinectRuntime-v2.0_1409-Setup.exe] dans le conteneur.
Les programmes d'installation sont assortis d'un CLUF et, d'après des personnes intelligentes de l'Université du Wisconsin Il existe une technique pour extraire les installateurs en utilisant le décompilateur dark.exe de Wix ( https://social.msdn.microsoft.com/Forums/en-US/a5b04520-e437-48e3-ba22-e2cdb46b4d62/silent-install-installation-instructions?forum=kinectsdk )
ex.
$ & 'C:\Program Files (x86)\WiX Toolset v3.11\bin\dark.exe' C:\installerwork\KinectRuntime-v2.0_1409-Setup.exe -x c:\installerwork\kinect_sdk_installersfiles
Le problème que j'ai rencontré lorsque je suis arrivé aux fichiers msi sous-jacents est qu'il n'y a pas d'option pour les exécuter silencieusement à l'aide de msiexec.
J'ai compris que l'installateur du runtime (Runtime installer (KinectRuntime-x64.msi) extrait du Kinect v2 SDK) effectue au moins les changements suivants dans le système de fichiers :
Crée un dossier "Kinect" dans C:\Windows\System32 et ajoute 3 fichiers au système 32 :
k4wcll.dll
kinect20.dll
microsoft._kinect.dll
Les trois derniers fichiers dans System32 devraient être les versions 64 bits (le programme d'installation semble avoir des versions x86 et x64 de ces trois fichiers).
Répliquer ces changements à la main ne mène pas au succès sur la machine hôte, et encore moins dans le conteneur.
Il n'est actuellement pas clair quels autres changements de registre/système se produisent avec l'installateur (et si oui ou non cela nous permettrait de franchir la ligne d'arrivée dans le conteneur Docker).
Des idées sur la façon de procéder à partir de là ?