【问题标题】:C# Ambiguous call in DirectSoundDirectSound 中的 C# 模糊调用
【发布时间】:2009-06-23 19:13:46
【问题描述】:

我正在尝试使用 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()'

我已经尝试了很多不同的说明命名空间和 using 语句的组合,但都没有成功。

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

只有 Microsoft.DirectX.DirectSound 引用的全新测试项目仍然会引发相同的错误。

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

最后,我在实验室的另一台计算机上尝试了一个新项目,但仍然无法正常工作。

以下是我的参考资料:

  • 图表
  • Microsoft.DirectX.DirectSound
  • Microsoft.DirectX.DirectInput
  • PresentationCore
  • 演示框架
  • 服务
  • 系统
  • 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

【问题讨论】:

  • 我在帖子中添加了更多信息。这是一个奇怪的问题。

标签: c# visual-studio-2008 ambiguous


【解决方案1】:

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

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

【讨论】:

  • 我需要一段时间才能测试这个,但一旦我这样做了,我会发布我的结果。非常感谢!
  • 谢谢!忽略对我有用.. 有一天我会学会总是编译而不是相信“当你键入时”语法检查,我现在不止一次被它烧毁了。
【解决方案2】:

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


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

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

展开此节点,并查找 2 个看起来像 directx 的条目。如果两个,去掉其中一个(最好是版本较低的那个)。然后尝试重建。

【讨论】:

  • 是的,我检查了参考文件夹。据我所知,唯一包含这些类的是 Microsoft.DirectX.DirectSound,仅此而已。即使我删除了其他 DirectX 引用 (Microsoft.DirectX.DirectInput),它仍然无法正常工作。我应该在我的参考资料文件夹中发布所有条目吗?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 我如何知道这两个引用来自哪里?我什至不确定这是不是问题,因为当我删除我知道相关的一个参考(Microsoft.DirectX.DirectSound)时,它抱怨根本找不到类。
    • 您会在参考文件夹中看到重复的条目。您使用的是哪个版本的 Microsoft.DirectX.DirectSound?
    • 我的 References 文件夹中没有重复项。它是 1.0.2902.0 版本(来自添加参考对话框)。它出现在 2009 年 3 月的 DirectX SDK 中。
    • 参考文件夹中有什么?我能够使用 2009 年 3 月的 SDK 在 VS C# Express 中启动一个新项目,并且在给定上述代码的情况下创建一个新类似乎可行。也许在一个孤立的环境中尝试它,看看它是否在您的项目或您的机器中。
    • 我已经在实验室的另一台机器上进行了尝试,结果相同。我已经用参考列表更新了原始帖子。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-27
        • 2011-07-29
        • 2011-12-12
        • 1970-01-01
        • 2012-06-23
        • 2011-01-16
        • 1970-01-01
        相关资源
        最近更新 更多