Filedialog CustomPlaces混乱

时间:2014-07-16 06:50:52

标签: c# winforms intellisense filedialog customplaces

我使用以下代码遇到了一个奇怪的行为:

FileDialog openFileDialog1;
// ...
openFileDialog1.CustomPlaces.Add(@"C:\whatever\");

使用.NET framework 2.0编译时没有错误 代码在Windows 7下运行良好。
但是在Windows XP下,我在运行时遇到以下错误:

  

System.MissingMethodException:找不到方法:' System.Windows.Forms.FileDialogCustomPlacesCollection System.Windows.Forms.FilaDialog.get_CustomPlaces()'。

试图找出问题告诉我:

  1. Visual Studio 2005帮助您不了解CustomPlaces的{​​{1}}属性
  2. MSDN表示此属性仅在框架3.5和&#34之后存在;在Windows XP上,此属性没有任何效果。"
  3. Visual Studio 2005 intellisense为我提供了属性的存在(所以我认为使用这个属性很好)
  4. 这显然不适合。

    我仍然想使用这些代码,所以我在调用它之前试图弄清楚如何检查:

    FileDialog

    我的问题是:
    .NET 2.0不支持if (...) { openFileDialog1.CustomPlaces.Add(@"C:\whatever\"); } 或Windows XP不支持
    如何正确处理?

    1)我是否必须检查 Windows 版本:

    CustomPlaces

    2)或者我必须检查 framework 版本:

    if (Environment.OSVersion.Version.Major >= 6) ...
    

    3)或两者,或者!?

1 个答案:

答案 0 :(得分:1)

您的帖子似乎已回答了您自己的问题。 MSDN文档明确指出FileDialog.CustomPlaces属性仅存在于.Net Framework 3.5之后。如果您的应用程序在.Net Framework 2.0上运行,那么不,它不受支持。 (实际上,查看属性的.NET 4.5 MSDN documentation,它似乎得到了.Net Framework 2.0 SP1的支持。)

如果您使用的是Visual Studio 2010或更高版本,我将确保您重新定位项目以使用.Net Framework 2.0(RTM)进行编译,如果这是您的应用程序将运行的框架。我注意到你特别提到了VS 2005.如果你使用VS 2005,我不相信它有任何重新定位功能(如果内存正确地为我服务);默认情况下,VS2005针对.NET Framework 2.0进行编译。事情变得有趣:.NET Framework 3.5的安装将.NET Framework 2.0 SP1和.NET Framework 3.0 SP1作为安装先决条件。因此,如果您的计算机只有.NET Framework 2.0并且您想要安装.NET Framework 3.5,那么您的.NET Framework 2.0将升级到.NET Framework 2.0 SP1(此外,还将安装.NET Framework 3.0 SP1)

那么这对你意味着什么?好吧,如果您在安装了.NET Framework 2.0 SP1或更高版本的计算机上编译程序,您的程序将编译得很好。此外,如果您在运行.NET Framework 2.0 SP1或更高版本的计算机上运行该程序,它也将运行正常。但是,如果您使用相同的程序并在仅包含vanilla .NET Framework 2.0的计算机上运行它,您将收到上面看到的错误,因为.NET Framework 2.0附带的库不支持该方法/属性

故事的另一面是MSDN文档的一部分,该文档说明。FileDialog.CustomPlaces虽然存在于.Net Framework 2.0 SP1及更高版本,并且虽然可以在Windows XP上安装该版本的Framework,在Windows XP上调用该属性没有任何效果(即它是一个空操作,操作系统不支持)。因此,不会发生任何错误,但您还会看到,当您在Windows XP上运行应用程序时,无法尝试添加到CustomPlaces集合中的任何内容。再次,查看.Net Framework 4.5.x的更新文档(请参阅上面的链接),它清楚地表明支持的最低支持的客户端操作系统平台是Windows Vista SP2。所以很有可能,在Windows XP方面你运气不好。

如果您想进行操作系统版本检查,我建议您进行以下检查:

if (Environment.OSVersion.Version.Major > 5 &&
    Environment.OSVersion.Version.Minor >= 0 &&
    Environment.OSVersion.ServicePack == "Service Pack 2")
{
    // Add CustomPlace here...
}

请注意,上面的检查将允许您为Windows Server 2008添加FileDialog.CustomPlaces(即使它受支持 - 因为通过.NET,您无法检查ProductTypeID属性)。此外,在Windows Server 2008 R2 SP1之前,Windows的服务器核心模式不支持FileDialog.CustomPlaces(但上面的代码允许您尝试添加自定义位置,但是像Windows XP一样,它将无声地失败)。为了确定这些版本的Windows,您需要使用一些PInvoke来访问位于GetVersionEx中的Win32 API的OSVERSIONINFOEX方法和kernel32.dll结构,如图所示{ {3}}和/或here

但是,一般来说,进行操作系统版本检查不是一个好主意。众所周知,它们很难(特别是对于较旧的操作系统)。您真正需要做的是执行.NET Framework版本检查。您的应用程序显然至少需要.NET Framework 2.0 SP1。如果您有一个程序安装程序,我会将此检查内置到您的安装程序中,并可选择在安装程序时安装.NET Framework 2.0 SP1。

如果您没有使用安装程序来分发程序,那么在尝试将FileSystemCustomPlace添加到CustomPlaces集合之前,应该在应用程序中执行.NET Framework版本检查以防止发生的错误;但是,这样做将要求您的用户使用Windows Vista及更高版本的版本以提升的权限运行应用程序。 Aaron Stebner对于如何使用示例代码确定计算机上可用的.NET Framework安装有一个很好的here。 CodeProject.com用户blog post提供了此代码的C#实现。