我正在创建一个使用 CodeProject CoreAudioApi(用于处理音频的非常流行的框架)的程序,但问题是 CoreAudioApi 使用的系统调用在 Vista 之前的任何 Windows 版本中都不可用。如果我运行一个用 CoreAudioApi 编译的程序(正常使用using
语句),该程序将在 Vista 之前的任何内容上崩溃。
我创建了这个函数来获取当前环境的版本号:
win_version = Environment.OSVersion.Version.Major;
这将返回我需要的主要版本号。'6' 是 Vista/7,其他都不是,这就是我需要确定的。利用这一点,我需要确定是否在操作系统大于或等于“6”时包含 CoreAudioApi 命名空间。从研究来看,using
s 需要与程序一起编译,但我也读过一些叫做反射的东西——这可能是我需要的。
一旦我得到了 CoreAudioApi 命名空间using
(抱歉缺少术语),剩下的就很容易了。我怎样才能做到这一点?
TL;DR 我需要某种形式的代码来有效地做到这一点:
using System;
using System.Text;
//etc
if(currentWindowsVersion>=6) using CoreAudioApi;
除了控制结构不能在类之外工作,并且所有命名空间都与程序一起编译,而不是单独控制。
谢谢!
编辑:到目前为止,我使用它来加载 CoreAudioApi 命名空间作为编译程序集:
if(win_version>=6){
CoreAudioApi = Assembly.LoadFrom("CoreAudio.dll");
CoreAudioApi.GetLoadedModules();
CoreAudioApi.GetTypes();
MessageBox.Show("Loaded CoreAudioApi");
}
从这里开始,我需要做的是实际使用 API 中的类型和方法。我在 Windows Vista/7 上工作的代码是这样的:
public static MMDeviceEnumerator devEnum;
public static MMDevice defaultDevice;
//later in a mute method:
defaultDevice.AudioEndpointVolume.Mute = true/false;
我什至真的不需要 devEnum AFAIK,所以真正重要的几行是最后两行(除了评论)。