5

我在我的机器上使用 3.5 SP1,而我们的客户目前使用没有 SP1 的 3.5。我不知道在 VS2008 中如何将解决方案或项目定位到不带 SP1 的 3.5,只有我安装的带 SP1 的 3.5。

如果我们使用 3.5 w/o SP1 中不可用的函数或构造函数,代码将无法正常工作。

也就是说,我想在编译时检测没有 SP1 的情况。

到目前为止,我们已经完成了测试(在 VM 或单独的机器中)以查看应用程序是否中断,并且有时当我们使用在 SP1 之前不可用的 API 部分时它确实会中断。问题是它仅在代码实际运行时(在运行时)而不是在加载程序集时中断。

一种解决方案是拥有一台带有 VS2008 w/o SP1 的机器并尝试编译该项目。但是,我更喜欢通过分析源代码或我们生成的程序集来帮助我检测对 3.5 SP1 的依赖项(由于使用新的 API 或其他原因)的工具。

我的谷歌能力对这个问题还不够强大,有什么提示吗?

4

5 回答 5

5

我刚遇到同样的问题,我找到了解决方案。对于我们的应用程序,是对 System.Threading.WaitHandle.WaitOne(Int32) 的调用给我们带来了麻烦。有关对服务包版本中引入的 API 的引用如何在 Visual Studio 不注意的情况下泄漏到您的代码中的更多详细信息,请参阅Krzysztof Cwalina 的帖子

好消息是,正如Marc 在他的回答中提到的那样,FxCop 有一个新规则来检测这些泄漏。坏消息是,当您以 .NET Framework 3.5 为目标时,FxCop 1.36 中的规则被破坏了。然而,David Kean 描述了如何编辑几个 XML 配置文件来解决这个问题。我按照说明进行操作,FxCop 现在检测到我对服务包 API 的引用。

于 2009-03-23T21:29:30.117 回答
2

这个怎么样?(FxCop 的多目标规则)

于 2008-10-24T12:05:09.780 回答
1

您可以使用此处找到的代码来检测已安装的 .NET Framework。

于 2008-10-24T14:14:53.120 回答
0

字符串 Fx35RegistryKey = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5"; 对象 Fx35ServicePack = Registry.GetValue(Fx35RegistryKey, "SP", null);

if (Fx35ServicePack == null || (int)Fx35ServicePack < 1) throw new Exception(".NET Framework 3.5 SP1 is required.");

于 2008-12-18T23:37:49.513 回答
0

还有一个我没有尝试过的选择。Visual Studio 文档说您可以使 ClickOnce 安装程序专门针对 .NET 3.5SP1 框架。点击链接,搜索“Targeting .NET Framework Version 3.5 SP1”。本质上,它说执行以下任何操作都会强制安装程序安装 3.5SP1:

  • 在“发布选项”对话框中指定错误 URL。
  • 在“发布选项”对话框中指定套件名称。
  • 在“发布选项”对话框中创建桌面快捷方式。
  • 从“应用程序文件”对话框中的哈希中排除文件。
  • 清除 Signing 页面上的 Sign the ClickOnce manifests 复选框。
  • 添加对 System.Data.Entity 程序集的引用。
于 2009-03-23T21:36:40.257 回答