我正在創建一個使用CodeProject CoreAudioApi(用於操縱音頻的非常流行的框架)的程序,但問題是CoreAudioApi使用的系統調用在任何版本的Windows早於Vista。如果我使用CoreAudioApi編譯程序(正常情況下使用using
語句),程序會在早於Vista的任何程序上崩潰。使用反射在某些操作系統上使用名稱空間
我創建這個函數來獲取當前環境的版本號:
win_version = Environment.OSVersion.Version.Major;
返回主版本號,我需要。 '6'是Vista/7,其他都不是,這是我需要確定的。利用這個,如果操作系統大於或等於'6',我需要確定是否包含CoreAudioApi命名空間。從研究中,using
需要與程序一起編譯,但我也讀過一些名爲Reflection的內容 - 這可能是我需要的。
一旦我得到CoreAudioApi命名空間using
'd(對於缺乏術語感到抱歉),其餘的很容易。我怎樣才能做到這一點?
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據我所知,所以真的是唯一重要的線是最後兩個(除了評論)。
你不能這樣使用'''',你需要動態加載你的程序集,看看http://msdn.microsoft.com/en-us/library/xbe1wdx9.aspx 具體來說,'' LoadFrom(string path)'方法及其替代方法。 – Davio
稍微偏離主題,但通過'Environment.OSVersion.Version.Major'獲取主要版本號要簡單得多。 –
@SteveDanner更加方便,謝謝! – Scott