gpt4 book ai didi

c# - Filedialog CustomPlaces困惑

转载 作者:行者123 更新时间:2023-11-30 17:47:26 25 4
gpt4 key购买 nike

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

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()'。


试图找出问题告诉我:


Visual Studio 2005帮助不了解 CustomPlacesFileDialog属性
MSDN说,此属性仅从框架3.5开始存在-并且“在Windows XP上,此属性没有任何作用。”
Visual Studio 2005 intellisense为我提供了该属性的持久性(所以我认为使用此属性很好)


这显然不合适。

我仍然想使用代码,因此我试图在调用它之前弄清楚怎么做检查:

if (...) {
openFileDialog1.CustomPlaces.Add(@"C:\whatever\");
}


我的问题是:
NET 2.0不支持 CustomPlaces还是Windows XP不支持
如何正确处理?

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

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


2)还是我必须检查框架版本:

if (Environment.Version.Major >= 4) ...


3)或者两者兼而有之!!

最佳答案

您似乎已在帖子中回答了自己的问题。 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)进行编译(如果您的应用程序将以此框架运行)。我注意到您特别提到了VS2005。如果您使用的是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或更高版本的计算机上运行该程序,它也可以正常运行。但是,如果您使用同一程序并在仅包含原始.NET Framework 2.0的计算机上运行该程序,则会得到上面看到的错误,因为.NET Framework 2.0附带的库中不支持该方法/属性。 。

故事的另一面是MSDN文档的一部分,其中说FileDialog.CustomPlaces从.Net Framework 2.0 SP1起存在,并且该版本的Framework可以安装在Windows XP上,而在Windows XP上调用该属性无效(即,它是null操作,操作系统不支持)。因此不会发生任何错误,但是您还将看到在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的Server Core模式不支持 FileDialog.CustomPlaces(但是上面的代码将允许您尝试添加自定义位置,但是像Windows XP一样,它将静默失败)。为了确定这些版本的Windows,您需要使用一些PInvoke来访问Win32 API的 GetVersionEx方法和 OSVERSIONINFOEX位于 kernel32.dll中的结构,如 here和/或< aa>。

但是,一般而言,进行操作系统版本检查不是一个好主意。它们非常困难(特别是对于较旧的操作系统)。您真正需要做的是执行.NET Framework版本检查。您的应用程序显然至少需要.NET Framework 2.0 SP1。如果您有程序的安装程序,我将在您的安装程序中建立此检查,并可以选择在安装程序的过程中提供安装.NET Framework 2.0 SP1的功能。

如果不使用安装程序分发程序,则应在应用程序中执行.NET Framework版本检查,然后再尝试将 FileSystemCustomPlace添加到 CustomPlaces集合中,以防止发生该错误。但是,这样做将要求您的Windows Vista和更高版本的用户使用提升的权限运行该应用程序。 Aaron Stebner在如何使用示例代码确定计算机上可用的.NET Framework安装方面很有帮助。 CodeProject.com用户 here提供的此代码的C#实现。

关于c# - Filedialog CustomPlaces困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24774042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com