所以我想用C#播放一些音频,我发现this:
基本上可以引用quartz.dll
并使用FilgraphManagerClass
。
这对我的应用来说是完美的,因为我希望能够在歌曲中的特定点开始播放歌曲。可以通过设置FilgraphManagerClass.CurrentPosition
来完成此操作。另外,我希望这首歌能够在后台播放而不会弹出任何特殊的播放器,这在使用这个dll时会发生。
不幸的是,当我尝试按照示例所示的那样做时, Visual Studio 2010 Express 会抱怨并告诉我“无法嵌入Interop类型FilgraphManagerClass
”。我被允许使用FilgraphManager
接口,但缺少CurrentPosition
属性和任何搜索能力。
This article建议只找到合适的界面。但似乎没有一个真正匹配FilgraphManagerClass
。它还简要讨论了嵌入程序集所涉及的安全性
要使用该课程,我最终右键点击QuartzTypeLib
引用并将设置Embed Interop Types
更改为false
。现在一切都按照预期运作。
好的......最后我的问题:
Embed Interop Types
所做的更改QuartzTypeLib
设置是否安全?答案 0 :(得分:1)
你需要忽略安全论点,这只是废话。问题是Embed Interop Type功能要求类型与COM服务器中的接口一一对应。它们必须具有匹配的[Guid]属性。该属性允许它们声明从不同程序集加载的类型是兼容的,即使它们来自不同的程序集。 Guid的比赛是关键。
名称以“Class”结尾的类存在问题。它们是“假”类,由真正的COM coclass合成。它解决了.NET不支持多重继承的问题。由于它们是自动生成的,因此它们的[Guid]与COM类型库中的CLSID不匹配,并且无法嵌入该类型,因为它们无法验证类型等价。
您经常可以避免多重继承问题,只需创建一个没有“Class”后缀的coclass实例。当然在这种情况下:
var player = new QuartzTypeLib.FilgraphManager();
player.RenderFile(@"c:\temp\test.avi");
编译并运行,不播放。但这是一个不同的问题,你应该使用Windows Media Player。从COM选项卡添加引用。
禁用EIT实际上不是问题,您只需在构建目录中获取需要在用户计算机上部署的interop.dll文件。 EIT实际上是为解决PIA(主互操作程序集)的问题而设计的,这是您没有在这里遇到的问题,因为您没有将本机COM接口暴露给任何其他程序集。