我使用以下代码遇到了一个奇怪的行为:
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()'。
试图找出问题告诉我:
CustomPlaces
的{{1}}属性这显然不适合。
我仍然想使用这些代码,所以我在调用它之前试图弄清楚如何检查:
FileDialog
我的问题是:
.NET 2.0不支持if (...) {
openFileDialog1.CustomPlaces.Add(@"C:\whatever\");
}
或Windows XP不支持
如何正确处理?
1)我是否必须检查 Windows 版本:
CustomPlaces
2)或者我必须检查 framework 版本:
if (Environment.OSVersion.Version.Major >= 6) ...
3)或两者,或者!?
答案 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#实现。