我计划使用两种Kinect。我已经安装了Kinect的VS C#,SDK 1.8和2.0,而我的问题是:

添加一个参考库(例如1.8)之后,无法添加另一个(例如2.0,消息“参考...已经存在”)。我认为这是由于名称空间和类的名称相同。因此,我无法实例化第二个传感器,

请为我提出解决方案,特别是如果可以通过某种方式访问​​同一资源的不同版本(例如,版本1.8和2.0中的KinectSensor类)时,建议我解决该问题?

最佳答案

有几种解决您的问题的方法。第一个(可能是最幼稚的)是创建两个不同的项目,每个项目都有不同的引用。然后,您可以编写一个使用前两个项目提供的数据的第三层。

如果确实需要在同一项目中使用两个引用,则还有另一种选择,它包括使用外部别名。

首先,添加一个引用(例如,Microsoft.Kinect,版本1.8)。然后,保存您的项目并关闭Visual Studio。在项目文件夹中,您应该找到一个.csproj文件,您可以使用文本编辑器打开该文件。查看其内容,您会发现这样的一行:

<Reference Include="Microsoft.Kinect, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />


现在,用以下内容更改上面的行:

<Reference Include="Microsoft.Kinect, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
    <Aliases>KinectV1</Aliases>
</Reference>
<Reference Include="Microsoft.Kinect, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
    <Aliases>KinectV2</Aliases>
</Reference>


现在,当您使用Visual Studio打开引用时,您应该在同一项目中看到这两个引用。

然后,您应该可以使用以下内容:

// You must declare aliases here:
extern alias KinectV1;
extern alias KinectV2;

// Then some using...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// ... and do not forget Kinect!
using KinectV1;
using KinectV2;

// Now you can do something like this:
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Something from Microsft.Kinect V2
            KinectV2.Microsoft.Kinect.HandState hs = KinectV2.Microsoft.Kinect.HandState.Closed;

            // Something from Microsft.Kinect V1
            KinectV1.Microsoft.Kinect.Skeleton s = new KinectV1.Microsoft.Kinect.Skeleton();
        }
    }
}


如果您的项目无法编译,请尝试关闭Visual Studio并删除隐藏的.suo文件(在您项目的.sln文件的同一文件夹中)。

如果您还有其他麻烦,请查看this answer

关于c# - 设置两个kinect:v1和v2,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35874140/

10-13 00:24