5

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

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

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

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

4

2 回答 2

3

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

public ref class MyManagedClass{
. . .
}

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

于 2012-09-03T21:50:33.413 回答
2

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

C++/CLI 可能需要更多的工作,因为您需要编写 CLI 包装器,但会使 C# 代码中的内容更清晰(我的观点)。

下面这篇文章应该可以帮助您入门:快速 C++/CLI - 在不到 10 分钟的时间内学习 C++/CLI

更深入的文章: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();
    }
  }
};
于 2012-09-03T21:49:51.527 回答