文件对话框CustomPlaces混淆
本文关键字:混淆 CustomPlaces 对话框 文件 | 更新日期: 2023-09-27 18:13:13
使用以下代码时,我遇到了一个奇怪的行为:
FileDialog openFileDialog1;
// ...
openFileDialog1.CustomPlaces.Add(@"C:'whatever'");
使用。net framework 2.0编译时没有错误。
代码在Windows 7下运行良好。
但是在Windows XP下,我在运行时得到以下错误:
系统。MissingMethodException: Method not found: ' system . windows . forms . filedialogcustomplace ()'.
试图找出问题告诉我:
- Visual Studio 2005帮助不知道
FileDialog
的CustomPlaces
属性 - MSDN说此属性仅从框架3.5开始存在-并且"在Windows XP上,此属性没有任何影响。"
- Visual Studio 2005智能感知为我提供了属性的存在(所以我认为使用这个属性是好的)
这显然不适合放在一起。
我仍然想使用代码,所以我试图弄清楚如何在调用它之前做检查:
if (...) {
openFileDialog1.CustomPlaces.Add(@"C:'whatever'");
}
我的问题是:CustomPlaces
不支持。net 2.0还是不支持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文档中的属性,它似乎在。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或更高版本的机器上运行该程序,它也可以正常运行。然而,如果你在一台只包含。net Framework 2.0的机器上运行同样的程序,你会得到上面看到的错误,因为。net Framework 2.0包含的库不支持该方法/属性。
故事的另一方面是MSDN文档的一部分,它说虽然FileDialog.CustomPlaces
存在于。net Framework 2.0 SP1及以后的版本,并且该框架版本可以安装在Windows XP上,但在Windows XP上调用该属性没有效果(即它是一个null-op,不被操作系统支持)。所以应该不会出现错误,但是您也会看到,当您在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之前,FileDialog.CustomPlaces
在Windows的Server Core模式上是不支持的(但是上面的代码将允许您尝试添加自定义位置,但是像Windows XP一样,它将无声地失败)。为了确定这些版本的Windows,您需要使用一点PInvoke来访问Win32 API的GetVersionEx
方法和OSVERSIONINFOEX
结构,位于kernel32.dll
中,如图和/或所示。
然而,一般来说,做操作系统版本检查不是一个好主意。它们是出了名的困难(特别是在较旧的操作系统上)。你真正需要做的是执行。net框架版本检查。显然,您的应用程序至少需要。net Framework 2.0 SP1。如果你的程序有安装程序,我会在你的安装程序中内置这个检查,并选择性地提供安装。net Framework 2.0 SP1的能力,作为程序安装的一部分。
如果你没有使用安装程序来分发程序,那么你应该在尝试将FileSystemCustomPlace
添加到CustomPlaces
集合之前在应用程序中执行.NET框架版本检查,以防止错误发生;但是,这样做需要Windows Vista及更高版本的用户以更高的权限运行应用程序。Aaron Stebner有一篇很棒的博客文章,介绍了如何用示例代码确定机器上可用的。net框架安装。这里还有一个CodeProject.com用户提供的c#实现。