修改嵌入式互操作类型参考设置(和音频播放器)的安全性
本文关键字:播放器 音频 安全性 互操作 嵌入式 类型 参考 设置 修改 | 更新日期: 2023-09-27 18:00:24
所以我想在C#中播放一些音频,结果发现:其基本上说参考CCD_ 1并使用CCD_。
这非常适合我的应用程序,因为我希望能够在歌曲中的特定点开始播放歌曲。可以通过设置FilgraphManagerClass.CurrentPosition
来做到这一点。此外,我希望这首歌能在后台播放,而不会弹出任何特殊的播放器,这在使用这个dll时会发生。
不幸的是,当我尝试按照示例所示操作时,Visual Studio 2010学习版会抱怨并告诉我"无法嵌入互操作类型FilgraphManagerClass
。"我可以使用FilgraphManager
接口,但这缺少CurrentPosition
属性和任何查找功能。
本文建议您只需找到合适的界面。但似乎没有一个真正匹配FilgraphManagerClass
。它还简要介绍了嵌入组件的安全性
为了使用该类,我最终右键单击了QuartzTypeLib
引用,并将设置Embed Interop Types
更改为quartz.dll
0。现在一切正常。
好的。。。最后是我的问题:
- 像我对
QuartzTypeLib
那样更改Embed Interop Types
设置是否安全 - 一般来说,所有COM类型都是这样吗
- 这种嵌入和元数据是什么?为什么它是安全的
- 有人可以信任的dll吗
您需要忽略安全参数,这只是无稽之谈。问题是嵌入互操作类型功能要求类型与COM服务器中的接口一一匹配。它们必须具有匹配的[Guid]属性。该属性允许他们声明从不同程序集加载的类型是兼容的,即使它们来自不同的程序集。Guid上的匹配项是关键。
这是名称以"Class"结尾的类的问题。它们是由真正的COM组件类合成的"假"类。它解决了.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接口。