使用以下代码,我遇到了一种奇怪的行为:
FileDialog openFileDialog1;
// ...
openFileDialog1.CustomPlaces.Add(@"C:\whatever\");使用.NET框架2.0进行编译时没有任何错误。
代码在Windows 7下运行良好。
但是,在Windows下,我在运行时得到以下错误:
未找到的方法:'System.Windows.Forms.FileDialogCustomPlacesCollection System.Windows.Forms.FilaDialog.get_CustomPlaces()'.
试图找出这个问题告诉我:
FileDialog的FileDialog属性这显然不符合乙醚。
我仍然想使用代码,所以在调用它之前,我正在尝试找出做检查的方法:
if (...) {
openFileDialog1.CustomPlaces.Add(@"C:\whatever\");
}我的问题是:
是.NET 2.0不支持的,或者是Windows 不支持的is
如何正确处理这件事?
1)是否必须检查Windows版本:
if (Environment.OSVersion.Version.Major >= 6) ...( 2)或者我是否需要检查框架版本:
if (Environment.Version.Major >= 4) ...3)或两者兼而有之,否则?
发布于 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版本检查,我建议您执行以下检查:
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用户这里提供。
https://stackoverflow.com/questions/24774042
复制相似问题