修改嵌入互操作类型参考设置(和音频播放器)的安全性

时间:2011-06-24 16:23:05

标签: c# com com-interop

所以我想用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设置是否安全?
  • 一般来说,所有COM类型都是如此吗?
  • 这是什么嵌入和元数据的东西,为什么它是安全的?
  • 有人可以信赖的dll吗?

1 个答案:

答案 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接口暴露给任何其他程序集。