C#在DirectSound中进行不明确的调用

时间:2009-06-23 19:13:46

标签: c# visual-studio-2008 ambiguous

我正在尝试使用DirectSound从麦克风中捕获声音。这是我的代码:

    using Microsoft.DirectX.DirectSound;
    public MicrophoneSensor()
    {
            CaptureBufferDescription micBufferDesc = new CaptureBufferDescription();
            WaveFormat format = new WaveFormat();
            format.SamplesPerSecond = 22000;
            format.Channels = 1;
            format.BitsPerSample = 8;
            format.AverageBytesPerSecond = 22000;
            format.BlockAlign = 1;

            micBufferDesc.Format = format;
            micBufferDesc.BufferBytes = 100000;
            micBufferDesc.ControlEffects = false;
            micBufferDesc.WaveMapped = true;

            micBuffer = new CaptureBuffer(micBufferDesc, microphone);
     }

micBufferDesc和格式变量的实例化会导致Visual Studio 2008抛出以下错误:

  

以下方法或属性之间的调用不明确:   'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription()'   和   'Microsoft.DirectX.DirectSound.CaptureBufferDescription.CaptureBufferDescription()'

     

     

电话之间的暧昧不明确   以下方法或属性:   'Microsoft.DirectX.DirectSound.WaveFormat.WaveFormat()'   和   'Microsoft.DirectX.DirectSound.WaveFormet.WaveFormat()'

我已经尝试了很多不同的组合来说明命名空间和使用语句,但没有运气。

我还检查了解决方案资源管理器中的引用,据我所知,没有重复项。

一个全新的测试项目,只有Microsoft.DirectX.DirectSound参考,没有别的东西仍然会抛出同样的错误。

我还卸载并重新安装了DirectX SDK(2009年3月)以及DirectX SDK(2008年11月)。仍然没有运气。

最后,我在实验室的另一台计算机上尝试了一个新项目,它仍然无效。

以下是我的参考资料:

  • 图形
  • Microsoft.DirectX.DirectSound
  • Microsoft.DirectX.DirectInput
  • PresentationCore
  • PresentationFramework
  • 服务
  • 系统
  • System.Core程序
  • System.Data
  • System.Data.DataSetExtensions
  • System.Deployment
  • System.Drawing中
  • System.Runtime.Serialization
  • System.ServiceModel
  • System.Windows.Forms的
  • 的System.Xml
  • System.Xml.Linq的
  • UIAutomationProvider
  • WindowsBase
  • WindowsFormsIntegration程序

6 个答案:

答案 0 :(得分:2)

我有同样的错误,它不是双重参考。单击运行并且编译器会神奇地忘记它,或者您可以通过以下方式完全停止烦恼。

using System.Reflection;

// then instead of WaveFormat fmt = new WaveFormat()

ConstructorInfo constructor = typeof(WaveFormat).GetConstructor(Type.EmptyTypes);
WaveFormat fmt = (WaveFormat)constructor.Invoke(null);

// do the same for CaptureBufferDescription

答案 1 :(得分:1)

听起来好像你正在引用directx程序集的多个版本。也许仔细检查你的参考文献。如果您需要多个版本,那么extern alias可能有所帮助 - 但它并不漂亮。


在Visual Studio中,查找“解决方案资源管理器”(通常位于右侧) - 这是项目中所有内容的树。这棵树中的一个项目是“参考文献”。这是您的代码配置使用的外部dll的直观表示。

(有很多很多.NET dll - 你需要告诉每个项目它可能需要什么样的dll)

展开此节点,查找两个看起来像directx的条目。如果 两个,则删除其中一个(理想情况下是较低版本的那个)。然后尝试重建。

答案 2 :(得分:0)

您已经包含了对包含该函数的程序集的不同版本的两个引用。删除其中一个参考文献。

答案 3 :(得分:0)

您可能有多个DirectX程序集的引用。检查项目,在References文件夹中。查找重复条目,特别是对多个版本的microsoft.directx.directsound.dll的引用。如果有重复项,请删除一个并重试。

答案 4 :(得分:0)

这是DirectSound的常见问题。您还会发现许多其他问题;)请记住,DS没有什么是它的样子。当缓冲区返回null时,它可能只是因为“读取位置”只是内部缓冲区写指针。因此,当您要求读取或写入指针时,计算至少一个块安全区域;)当您从ds方法获得缓冲区位置时,请使用try cast,因为它可能会抛出随机错误。

答案 5 :(得分:0)

强制你的软件在x86或x64中编译而不是'任何CPU'将解决问题。