c# - 是否可以在 Docker 容器中运行 Kinect V2?

标签 c# windows docker wix kinect

我正在探索在 (something like Continuous Gesture Basics project https://github.com/angelaHillier/ContinuousGestureBasics-WPF) 中运行 C# Kinect 视觉手势程序 Docker for Windows container. 的可行性

  1. 这在理论上是否可行(在 Docker for Windows 容器中运行 C# Kinect?)

  2. 如果 1 的答案是肯定的,这里有一些额外的细节:

我使用 microsoft/dotnet-framework:4.7 镜像作为基础,我的初始 Dockerfile 如下所示:

FROM microsoft/dotnet-framework:4.7
ADD . /home/gesture
WORKDIR /home/gesture

构建镜像:

$ docker build -t kinect .

开启容器:

$ docker run -dit --name kinectContainer kinect

附加到一个 powershell session 以四处游荡:

$ docker exec -it kinectContainer powershell

当我尝试从 Docker 容器运行我的手势应用程序时,我收到以下错误(这是预期的,因为容器中没有安装 Kinect SDK):

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

此时,最大的问题是如何在容器中安装Kinect v2 SDK [KinectSDK-v2.0_1409-Setup.exe]Kinect v2 runtime [KinectRuntime-v2.0_1409-Setup.exe]

安装程序有 EULA,根据 some clever University of Wisconsin folks,有一种技术可以使用 Wix 的 dark.exe 反编译器 (https://social.msdn.microsoft.com/Forums/en-US/a5b04520-e437-48e3-ba22-e2cdb46b4d62/silent-install-installation-instructions?forum=kinectsdk) 提取安装程序

例如。

$ & '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

当我处理底层 msi 文件时遇到的问题是没有选项可以使用 msiexec 静默运行它们。

我发现运行时安装程序(从 Kinect v2 SDK 中提取的运行时安装程序 (KinectRuntime-x64.msi))至少对文件系统进行了以下更改:

在 C:\Windows\System32 中创建一个文件夹“Kinect”,并将 3 个文件添加到 System 32:

k4wcll.dll

kinect20.dll

microsoft._kinect.dll

System32 中的最后三个文件应该是 64 位版本(安装程序似乎有这 3 个的 x86 和 x64 版本)

手动复制这些更改不会在主机上成功,更不用说在容器中了。

目前尚不清楚安装程序正在发生哪些其他注册表/系统更改(以及这是否会让我们超过 Docker 容器中的目标线)

关于如何从这里开始的任何想法?

最佳答案

简而言之,没有。 Windows 上的 docker 不具备硬件隧道/映射的能力。在 Linux 上,它通过 --device= 选项

正如@VonC 所说,您将需要使用 Windows 虚拟机,这可能是 Hyper-V,或者您可以使用 Virtual Box,然后您可以通过隧道方法(添加/连接设备)提供 Kinect 硬件,否则将无论您的容器是否是该 VM,都无法通过 Windows 访问主机的硬件。

关于c# - 是否可以在 Docker 容器中运行 Kinect V2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47797873/

相关文章:

c# - 在 C# 后端代码中的 http get 请求中包含原始文本

c# - 使用字符串从上下文中获取表

c# - Mysql pdate查询错误

c - fgetpos() 行为取决于换行符

windows - 检查命令是否在CMD中是内部的

docker - 如何强制 'docker login'命令忽略现有的凭据帮助程序?

docker - 加载 native 库时出错“/app/runtimes/linux/native/libgrpc_csharp_ext.x64.so - Grpc Core on Docker 容器

c# - 迭代数据表中的特定列

apache - 502 Bad Gateway nginx/1.11.5 在 docker 中运行

java - 焦点窗口的 GetModuleFileName JNA Windows 操作系统