从 .NET Windows Form 应用程序检查先决条件
Check for prerequisite from a .NET Windows Form application
我想在 .NET Windows Form application
安装期间或打开时检查 第三方应用程序 的安装情况。我的 Windows 表单应用程序不需要第三方应用程序 运行 但它确实需要第三方应用程序才能工作。例如My Windows Form应用程序打开第三方应用程序如邮件程序。
我不知道 Click Once
是否是正确的策略?我需要它在安装过程中检查先决条件,如果不存在则通知用户先安装它。如果 Click Once
不是正确的策略,还有其他方法吗?也许我需要先安装我的 Windows Form 应用程序,然后在打开它时检查第三方应用程序?问题在于,安装路径可能因机器而异。我不太确定该怎么做。
此 link 解释了如何在 Click Once 中包含先决条件,但这不是我想要做的。
另一个 link 谈到包括先决条件而不只是检测它们。
一种可能的解决方案是使用此方法检查注册表,returns bool 值指示是否存在具有应用程序名称的注册表记录:
public static bool IsApplictionInstalled(string p_name)
{
string displayName;
RegistryKey key;
// search in: CurrentUser
key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// search in: LocalMachine_32
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// search in: LocalMachine_64
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// NOT FOUND
return false;
}
我想在 .NET Windows Form application
安装期间或打开时检查 第三方应用程序 的安装情况。我的 Windows 表单应用程序不需要第三方应用程序 运行 但它确实需要第三方应用程序才能工作。例如My Windows Form应用程序打开第三方应用程序如邮件程序。
我不知道 Click Once
是否是正确的策略?我需要它在安装过程中检查先决条件,如果不存在则通知用户先安装它。如果 Click Once
不是正确的策略,还有其他方法吗?也许我需要先安装我的 Windows Form 应用程序,然后在打开它时检查第三方应用程序?问题在于,安装路径可能因机器而异。我不太确定该怎么做。
此 link 解释了如何在 Click Once 中包含先决条件,但这不是我想要做的。
另一个 link 谈到包括先决条件而不只是检测它们。
一种可能的解决方案是使用此方法检查注册表,returns bool 值指示是否存在具有应用程序名称的注册表记录:
public static bool IsApplictionInstalled(string p_name)
{
string displayName;
RegistryKey key;
// search in: CurrentUser
key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// search in: LocalMachine_32
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// search in: LocalMachine_64
key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (String keyName in key.GetSubKeyNames())
{
RegistryKey subkey = key.OpenSubKey(keyName);
displayName = subkey.GetValue("DisplayName") as string;
if (p_name.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true)
{
return true;
}
}
// NOT FOUND
return false;
}