首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Filedialog CustomPlaces混淆

Filedialog CustomPlaces混淆
EN

Stack Overflow用户
提问于 2014-07-16 06:50:52
回答 1查看 538关注 0票数 3

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

代码语言:javascript
复制
FileDialog openFileDialog1;
// ...
openFileDialog1.CustomPlaces.Add(@"C:\whatever\");

使用.NET框架2.0进行编译时没有任何错误。

代码在Windows 7下运行良好。

但是,在Windows下,我在运行时得到以下错误:

未找到的方法:'System.Windows.Forms.FileDialogCustomPlacesCollection System.Windows.Forms.FilaDialog.get_CustomPlaces()'.

试图找出这个问题告诉我:

  1. Visual 2005帮助不了解FileDialogFileDialog属性
  2. MSDN说这个属性只存在于Framework3.5-和“在Windows上,这个属性没有任何影响”。
  3. Visual 2005 intellisense为我提供了该属性的存在(因此我认为使用该属性是可以的)

这显然不符合乙醚。

我仍然想使用代码,所以在调用它之前,我正在尝试找出做检查的方法:

代码语言:javascript
复制
if (...) {
    openFileDialog1.CustomPlaces.Add(@"C:\whatever\");
}

我的问题是:

是.NET 2.0不支持的,或者是Windows 不支持的is

如何正确处理这件事?

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

代码语言:javascript
复制
if (Environment.OSVersion.Version.Major >= 6) ...

( 2)或者我是否需要检查框架版本:

代码语言:javascript
复制
if (Environment.Version.Major >= 4) ...

3)或两者兼而有之,否则?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-26 19:54:20

看来你已经在你的岗位上回答了你自己的问题。MSDN文档明确指出,FileDialog.CustomPlaces属性仅存在于.Net Framework3.5之后。如果您的应用程序运行在.Net Framework2.0上,则不支持它。(实际上,看看.NET 4.5MSDN文档

如果您使用的是VisualStudio2010或更高版本,我将确保您重定向您的项目使用.Net Framework2.0 (RTM)编译,如果这是您的应用程序将使用的框架。我注意到你特别提到了VS 2005。如果您正在使用VS 2005,我不认为它具有任何重定向功能(如果内存服务正确的话);默认情况下,VS2005会根据.NET Framework2.0进行编译。这是事情变得有趣的地方:安装.NET Framework3.5的前提条件是.NET Framework2.0 SP1和.NET Framework3.0 SP1。因此,如果您的计算机只有.NET Framework2.0,并且您希望安装.NET Framework3.5,那么您的.NET Framework2.0将升级到.NET Framework2.0 SP1 (另外,还将安装.NET Framework3.0SP1)。

这对你意味着什么?如果您在安装了.NET Framework2.0 SP1或更高版本的计算机上编译程序,您的程序就会编译得很好。此外,如果您在运行.NET Framework2.0 SP1或更高版本的机器上运行该程序,它也会运行得很好。但是,如果您使用相同的程序并在只包含普通的.NET Framework2.0的机器上运行它,您将得到上面看到的错误,因为.NET Framework2.0包含的库中不支持该方法/属性。

故事的另一面是MSDN文档中的一部分,即虽然FileDialog.CustomPlaces存在于.Net Framework2.0 SP1及以后,虽然该框架的那个版本可能安装在Windows上,但在Windows上调用该属性没有任何效果(即它是一个null-op,操作系统不支持)。因此,不应该发生错误,但您还会看到,在Windows上运行应用程序时,您尝试添加到CustomPlaces集合的任何内容都不会显示出来。同样,查看.Net Framework4.5.x的更新文档(请参阅上面的链接),它清楚地表明支持的客户端操作系统平台是Windows SP2。因此,很有可能,当涉及到Windows时,您是不走运的。

如果您想要进行OS版本检查,我建议您执行以下检查:

代码语言:javascript
复制
if (Environment.OSVersion.Version.Major > 5 &&
    Environment.OSVersion.Version.Minor >= 0 &&
    Environment.OSVersion.ServicePack == "Service Pack 2")
{
    // Add CustomPlace here...
}

请注意,上面的检查将不允许您添加Windows 2008的FileDialog.CustomPlaces (尽管支持它--因为通过.NET,您无法检查ProductTypeID属性)。此外,直到Windows 2008 FileDialog.CustomPlaces R2 SP1才支持Windows的服务器核心模式(但上面的代码将允许您尝试添加自定义位置,但与Windows一样,它将以静默方式失败)。为了确定这些版本的Windows,您需要使用一些PInvoke来访问Win32 API的GetVersionEx方法和位于kernel32.dll中的OSVERSIONINFOEX结构,如所示的这里和/或这里

但是,一般来说,做操作系统版本检查并不是一个好主意。他们是众所周知的困难(特别是对旧的操作系统)。您真正需要做的是执行.NET框架版本检查。您的应用程序显然至少需要.NET Framework2.0 SP1。如果您的程序有一个安装程序,我将在此对您的安装程序进行检查,并提供安装.NET Framework2.0 SP1的能力,作为安装程序的一部分。

如果没有使用安装程序分发程序,则在尝试将.NET添加到CustomPlaces集合之前,应在应用程序中执行CustomPlaces框架版本检查,以防止错误发生;但是,这样做将要求具有Windows版本的用户和以后的用户以更高的权限运行应用程序。available有一个很好的博客帖子,介绍如何用示例代码确定计算机上可用的.NET框架安装。还有一个C#实现,该代码由CodeProject.com用户这里提供。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24774042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档