2013-03-09 29 views
0

我有一个C++项目,将调用一个C#函数,然后,C#将调用一个C++函数(都带有返回值)。我坚持在COM接口,有人在这里在stackoverflow给我(我没有太多经验的C + +或C#,只有Java),但由于某种原因,它给了我一个错误,当我尝试编译C++代码,致命错误C1196 :'FaceTrackingBasics-WPF':在类型库中找到的标识符c:\ FaceTrackingBasics-WPF/bin/x86/Debug/FaceTrackingBasics-WPF.tlb'不是有效的C++标识符。使用COM接口C#从C++访问会产生错误

你能发现一些错误吗?也许我不应该在一个文件中有两个类?顺便说一句,C#代码与窗口相关联,我不知道它是否会导致问题。 由于

C#代码

// --------------------------------------------------------------------------------    ------------------------------------ 
    // <copyright file="FaceTrackingViewer.xaml.cs" company="Microsoft"> 
    //  Copyright (c) Microsoft Corporation. All rights reserved. 
    // </copyright> 
    // --------------------------------------------------------------------------------  ------------------------------------ 

    namespace FaceTrackingBasics 
    { 
using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 
using Microsoft.Kinect; 
using Microsoft.Kinect.Toolkit.FaceTracking; 

using System.Globalization; 

///// 
using System.Runtime.InteropServices; 


using Point = System.Windows.Point; 

/// <summary> 
/// Class that uses the Face Tracking SDK to display a face mask for 
/// tracked skeletons 
/// </summary> 
public partial class FaceTrackingViewer : UserControl, IDisposable 
{ 
    public static readonly DependencyProperty KinectProperty = DependencyProperty.Register(
     "Kinect", 
     typeof(KinectSensor), 
     typeof(FaceTrackingViewer), 
     new PropertyMetadata(
      null, (o, args) => ((FaceTrackingViewer)o).OnSensorChanged((KinectSensor)args.OldValue, (KinectSensor)args.NewValue))); 

    private const uint MaxMissedFrames = 100; 



    private Boolean drawFlat = false; 

    public FaceTrackingViewer() 
    { 
     this.InitializeComponent(); 
    } 

    ~FaceTrackingViewer() 
    { 
     this.Dispose(false); 
    } 

    public KinectSensor Kinect 
    { 
     get 
     { 
      return (KinectSensor)this.GetValue(KinectProperty); 
     } 

     set 
     { 
      this.SetValue(KinectProperty, value); 
     } 
    } 

    public void Dispose() 
    { 
     this.Dispose(true); 
     GC.SuppressFinalize(this); 
    } 


    //i deleted the rest of the code, i dont think its relevant 
    } 
} 

//***********************// 

[ComVisible(true)] 
[Guid("2EF06BCB-A25B-41AD-B233-33A956DBEB69")] 
public struct Ponto 
{ 
    public double x; 
    public double y; 

    public Ponto(double x, double y) 
    { 
     this.x = x; 
     this.y = y; 
    } 
} 

[ComVisible(true)] 
[Guid("EB9258F5-DCFB-4F91-8342-5A05EB17557D")] 
public interface IManagedClass 
{ 
    Ponto[] Foo(); 
} 

[ComVisible(true)] 
[Guid("11B23AD7-F79E-45D7-BC87-89F0DBC8B83F")] 
[ClassInterface(ClassInterfaceType.None)] 
public class ManagedClass : IManagedClass 
{ 
    private List<Ponto> points; 

    public ManagedClass() 
    { 
     points = new List<Ponto>(); 
     points.Add(new Ponto(1.0, 1.0)); 
     points.Add(new Ponto(2.0, 2.0)); 
     points.Add(new Ponto(3.0, 3.0)); 
    } 

    public Ponto[] Foo() 
    { 
     return points.ToArray(); 
    } 
} 

C++代码

#include "stdafx.h" 

    #import  "C:/Users/Pedro/Dropbox/0000000TESE/000_visual_studio/0FaceTMS/FaceTrackingBasics-    WPF/bin/x86/Debug/FaceTrackingBasics-WPF.tlb" 
    #include <iostream> 

    using namespace FaceTrackingBasics; 
    using namespace std; 

    int main() 
    { 
::CoInitialize(NULL); 

{ 
    IManagedClassPtr pManagedClass(__uuidof(ManagedClass)); 

    SAFEARRAY* psa = pManagedClass->Foo(); 
    Ponto* pPoints = (Ponto*)psa->pvData; 

    for (int i = 0; i < 3; ++i) 
     cout << pPoints[i].x << " " << pPoints[i].y << endl; 
} 

::CoUninitialize(); 
} 
+0

在'#import'路径有14位,后'FaceTrackingBasics-',在这些空间应该在那里,他们在你的原始代码? – 2013-03-09 16:22:47

+0

你有没有修改你像[ComVisible(true)] assambly? – Thanatos 2013-03-09 16:39:31

+0

斯科特,它的一个副本粘贴错误,在我的代码中它的所有在一起,没有空格。我不知道你的意思,但我有我的代码 – virgula24 2013-03-09 19:46:31

回答

0
'FaceTrackingBasics-WPF' : ... is not a valid C++ identifier 

它不是,一个C++标识符不能含有破折号 “ - ”。就像C#顺便说一句。这个名字来自你的项目名称。其中设置了类型库名称。其中设置了#import指令创建的名称空间的名称。

除了简单地重命名项目之外,还有几种可能的解决方法。 #import指令可以将apply attributes。像“自动重命名”,“没有命名空间”和“重命名名称空间”:

#import "FaceTrackingBasics-WPF.tlb" rename_namespace("managed") 
    using namespace managed; 
+0

'指令'谢谢!我做了你所说的,它现在可以构建解决方案,但visual studio仍然给我红色的“使用名称空间管理”,并在我的所有主要类的c + +代码。有什么想法吗? – virgula24 2013-03-09 20:56:38

+0

我在想#include 。它解决了,感谢所有的帮助! – virgula24 2013-03-09 20:58:37