托管C ++程序集可以将对象返回给C#吗?

时间:2012-09-03 21:44:03

标签: c# c++-cli managed-c++

我正在编写一个必须读取视频文件视频属性的C#应用​​程序。我发现这样做的唯一方法是使用需要C ++的Microsoft Media Foundation。

到目前为止,我已经取得了一些进展:

  • 我创建了一个可编译的DLL C ++程序集。
  • 我可以使用C#代码中的参数调用它。
  • 执行并打印视频文件属性。

我接下来要做的是让DLL返回视频属性的对象(宽度,高度,持续时间等)。鉴于我正在使用C ++托管代码,是否有一种简单的方法来定义对象类型并使用它来在C#和C ++之间传递数据,还是我必须使用Marshal类?

2 个答案:

答案 0 :(得分:3)

当然!如果在托管C ++中定义公共对象(也称为C ++ / CLI):

public ref class MyManagedClass{
. . .
}

然后从你的c#项目中引用dll,就像你在c#中定义它一样,你将能够使用该对象。

答案 1 :(得分:2)

您可以COM InteropC++/CLI访问C ++对象/ dll。使用C++/CLI,您可以创建自己的包装器对象/类,这些对象/类可直接在C#中使用。了解C ++和C#,语法对您来说有点熟悉(并且在线有很好的资源)。

C ++ / CLI可能需要更多的工作,因为您需要编写CLI包装器,但是会在C#代码中保持更清晰(我的意见)。

以下文章可以帮助您入门:Quick C++/CLI - Learn C++/CLI in less than 10 minutes

更深入的文章:http://msdn.microsoft.com/en-us/magazine/cc163852.aspx

一个代码示例(显示大小写的语法),让事情变得更加精彩,从上面借鉴。 Student是您的C ++类,StudentWrapper是您在C#代码中使用的CLI包装器:

public ref class StudentWrapper
{
private:
  Student *_stu;
public:
  StudentWrapper(String ^fullname, double gpa)
  {
    _stu = new Student((char *) 
           System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(
           fullname).ToPointer(), 
      gpa);
  }
  ~StudentWrapper()
  {
    delete _stu;
    _stu = 0;
  }

  property String ^Name
  {
    String ^get()
    {
      return gcnew String(_stu->getName());
    }
  }
  property double Gpa
  {
    double get()
    {
      return _stu->getGpa();
    }
  }
};