C# Filedialog会引起混乱

C# Filedialog会引起混乱,c#,winforms,intellisense,filedialog,customplaces,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.FileDialo

我使用以下代码面对一个奇怪的行为:

FileDialog openFileDialog1;
// ...
openFileDialog1.CustomPlaces.Add(@"C:\whatever\");
使用.NET framework 2.0进行编译时不会出错。
该代码在Windows 7下运行良好。
但在Windows XP下,我在运行时遇到以下错误:

System.MissingMethodException:找不到方法:“System.Windows.Forms.FileDialogCustomPlacesCollection System.Windows.Forms.Filadilog.get_CustomPlaces()”

试图找出问题告诉我:

  • Visual Studio 2005帮助不知道
    FileDialog
  • 表示此属性仅在framework 3.5之后存在,并且“在Windows XP上,此属性没有任何效果。”
  • Visual Studio 2005 intellisense为我提供了该属性的存在性(因此我认为使用该属性很好)
  • 那显然不适合她

    我仍然想使用该代码,因此我正在尝试在调用do检查之前找出它的方式:

    if (...) {
        openFileDialog1.CustomPlaces.Add(@"C:\whatever\");
    }
    
    我的问题是:
    是.NET 2.0不支持的
    CustomPlaces
    还是Windows XP不支持的?

    如何正确处理此问题?

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

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


    3) 或者两者都有,否则

    看来你在帖子中回答了自己的问题。MSDN文档明确指出,
    FileDialog.CustomPlaces
    属性仅在.Net Framework 3.5之后才存在。如果您的应用程序运行在.Net Framework 2.0上,则不支持。(实际上,从属性的角度来看,从.Net Framework 2.0 SP1开始,它似乎就得到了支持。)

    如果您使用的是Visual Studio 2010或更高版本,我会确保您将项目重新定位为使用.Net Framework 2.0(RTM)进行编译,如果您的应用程序将针对该框架运行。我注意到你特别提到了VS2005。如果您使用的是VS2005,我不相信它有任何重新定位的功能(如果内存正确的话);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)

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

    故事的另一面是MSDN文档的一部分,该文档指出,
    FileDialog.CustomPlaces
    是从.Net Framework 2.0 SP1及以后版本开始存在的,虽然该版本的框架可能安装在Windows XP上,但在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添加
    文件对话框.CustomPlaces
    (尽管它是受支持的,因为通过.NET,您无法检查
    ProductTypeID
    属性)。此外,在Windows Server 2008 R2 SP1之前,Windows的服务器核心模式不支持
    FileDialog.CustomPlaces
    (但上面的代码允许您尝试添加自定义位置,但与Windows XP一样,它将以静默方式失败)。为了确定这些版本的Windows,您需要使用一点PInvoke来访问Win32 API的
    GetVersionEx
    方法和
    OSVersionInfo
    结构(位于
    kernel32.dll
    中),如图和/或所示

    然而,一般来说,执行操作系统版本检查不是一个好主意。它们是出了名的困难(尤其是对于较旧的操作系统)。您真正需要做的是执行.NET Framework版本检查。您的应用程序显然至少需要.NET Framework 2.0 SP1。如果您的程序有安装程序,我会将此检查内置到您的安装程序中,并提供安装.NET Framework 2.0 SP1的能力,作为安装程序的一部分节目

    如果您没有使用安装程序分发程序,则在尝试将
    文件系统CustomPlace
    添加到
    CustomPlaces
    集合之前,您应该在应用程序中执行.NET Framework版本检查,以防止发生错误;但是,这样做需要用户具有Wind版本Aaron Stebner非常了解如何使用示例代码确定计算机上可用的.NET Framework安装。CodeProject.com用户还提供了此代码的C#实现

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