CodeProject CoreAudioApi (オーディオを操作するための非常に一般的なフレームワーク) を使用するプログラムを作成していますが、問題は CoreAudioApi が Vista より前の Windows のどのバージョンでも使用できないシステム コールを使用することです。CoreAudioApi でコンパイルされたプログラムを (using
通常どおりステートメントを使用して) 実行すると、プログラムは Vista より前のバージョンでクラッシュします。
現在の環境のバージョン番号を取得するために、この関数を作成しました。
win_version = Environment.OSVersion.Version.Major;
これにより、必要なメジャー バージョン番号が返されます。'6' は Vista/7 で、それ以外は違います。これだけで判断する必要があります。これを利用して、OSが「6」以上の場合にCoreAudioApi名前空間を含めるかどうかを判断する必要があります。調査によると、using
s はプログラムと共にコンパイルする必要がありますが、Reflection と呼ばれるものについても読みました。これが必要かもしれません。
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を本当に必要としないので、本当に重要なのは最後の2行だけです(コメントを除く)。