1

アプリケーションが .net 4.0 で実行されている場合、.net 2.0 の machine.config ファイルへのパスを取得する最良の方法は何ですか?

1 つの方法は、文字列操作とファイル システム アクセスを実行して v4.0* を v2.0* に置き換え new ConfigurationFileMap().MachineConfigFilename;、それを に渡すことConfigurationManager.OpenMappedMachineConfiguration(new ConfigurationFileMap(<HERE>))です。これ以上の解決策がない場合は、この解決策に頼ります。

4

1 に答える 1

7

ASP.NETバージョンのmachine.configへのパスが必要だったので、すべての.NETフレームワークパスを気にしませんでした(たとえば、3および3.5フレームワークは2.0の拡張にすぎないため)。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NETレジストリキーとPathフレームワークキーの値をクエリすることになりました。最後config\machine.configにフレームワークパスに追加すると、望ましい結果が得られました。

ASP.NETランタイムをmachine.configパスにマップする方法では、「v2.0」、「2.0.50727.0」、または「v2」と「2」のいずれかの形式の文字列を使用し、「2.0」のように10進数の1桁に正規表現します。 「または「2」のように10進数が指定されていない場合は、最初の1桁で、レジストリから正しい値を取得します。これに似たもの:


string runtimeVersion = "2.0";
string frameworkPath;
RegistryKey regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\ASP.NET");
foreach (string childKeyName in regKey.GetSubKeyNames())
{
   if (Regex.IsMatch(childKeyName, runtimeVersion))
   {
       RegistryKey subKey = regKey.OpenSubKey(childKeyName))
       {
          frameworkPath = (string)subKey.GetValue("Path");
       }
   }
}
string machineConfigPath = Path.Combine(frameworkPath, @"config\machine.config");
string webRootConfigPath = Path.Combine(frameworkPath, @"config\web.config");

最後に、この構成をWebConfigurationMapに渡します(Microsoft.Web.Administrationを使用していますが、System.Configurationでも使用できます。コードはほとんど同じです)。


using (ServerManager manager = new ServerManager())
{
   Configuration rootWebConfig = manager.GetWebConfiguration(new WebConfigurationMap(machineConfigPath, webRootConfigPath), null);
}

WebConfigurationMapは、構成をカスタムmachine.configおよびroot web.configにマップします(したがって、GetWebConfiguration()の2番目の引数としてnull)

于 2011-02-01T20:08:48.103 に答える