F# F中的DirectShow.Net接口问题#

F# F中的DirectShow.Net接口问题#,f#,directshow.net,c#-to-f#,F#,Directshow.net,C# To F#,所以我在看DirectShow.Net的示例代码,特别是在Capture文件夹示例下的PlayCap示例。您可以下载C#中的示例。它通过将对象强制转换到接口来做一些有趣的事情。当我试图在F#中忠实地再现它时,对象无法正确地投射 C#: IVideoWindow videoWindow=null; IMediaControl mediaControl=null; IMediaEventEx mediaEventEx=null; IGraphBuilder graphBuilder=null; IC

所以我在看DirectShow.Net的示例代码,特别是在Capture文件夹示例下的PlayCap示例。您可以下载C#中的示例。它通过将对象强制转换到接口来做一些有趣的事情。当我试图在F#中忠实地再现它时,对象无法正确地投射

C#:

IVideoWindow videoWindow=null;
IMediaControl mediaControl=null;
IMediaEventEx mediaEventEx=null;
IGraphBuilder graphBuilder=null;
ICaptureGraphBuilder2 captureGraphBuilder=null;
然后在后面的
GetInterfaces()
中:

this.graphBuilder=(IGraphBuilder)new FilterGraph();
this.captureGraphBuilder=(ICaptureGraphBuilder2)新的CaptureGraphBuilder2();
this.mediaControl=(IMediaControl)this.graphBuilder;
this.videoWindow=(IVideoWindow)this.graphBuilder;
this.mediaventex=(imediaventex)this.graphBuilder;
所以我对我的代码所做的是F#:

let可变视频窗口:IVideoWindow=null;
让可变mediaControl:IMediaControl=null;
让可变mediaEventEx:IMediaEventEx=null;
让可变graphBuilder:IGraphBuilder=null;
让可变captureGraphBuilder:ICaptureGraphBuilder2=null;
稍后在
GetInterfaces()
中:

graphBuilder-IGraphBuilder
captureGraphBuilder ICaptureGraphBuilder2
中间控制;
视窗;视窗;
mediaEventEx-IMediaEventEx;
这看起来像是一种忠实的消遣。甚至不使用功能性风格。我在看F#中的演员阵容,看我是否做得对。看起来我是,虽然他们有一个例子,这在本质上是难以置信的最小

问题是我得到了错误:

类型约束不匹配。类型“FilterGraph”与类型“IGraphBuilder”不兼容


我得到一个类似的错误为每一个。我也尝试过使用
:?>

进行向下转换。我发现自己遇到了类似的问题,结果是在C中,可以向COM接口和COM实现添加GUID属性,并且该类将显示为接口的有效实现。然而,F#type系统更为严格,不允许这样做。您可以使用unbox函数来分配它们

graphBuilder <- unbox (new FilterGraph())
captureGraphBuilder <- unbox (new CaptureGraphBuilder2())

graphBuilder也许这个问题有相关的答案,因为您对通过底层COM
QueryInterface
call进行的“COM casting”感兴趣。我很欣赏这个答案,这样我就知道如何解决未来此类问题。但现在,我已经转而使用Forge的Directshow.NET实现进行视频捕获,因为它更简单,使用的样板代码更少。