我正在编写一个必须读取视频文件视频属性的C#应用程序。我发现这样做的唯一方法是使用需要C ++的Microsoft Media Foundation。
到目前为止,我已经取得了一些进展:
我接下来要做的是让DLL返回视频属性的对象(宽度,高度,持续时间等)。鉴于我正在使用C ++托管代码,是否有一种简单的方法来定义对象类型并使用它来在C#和C ++之间传递数据,还是我必须使用Marshal类?
答案 0 :(得分:3)
当然!如果在托管C ++中定义公共对象(也称为C ++ / CLI):
public ref class MyManagedClass{
. . .
}
然后从你的c#项目中引用dll,就像你在c#中定义它一样,你将能够使用该对象。
答案 1 :(得分:2)
您可以COM Interop或C++/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();
}
}
};