检测.NET Framework 3.5 SP1依赖项(与不带SP1的3.5相比较)

5
我正在使用我机器上的3.5 SP1,而我们的客户目前使用没有SP1的3.5。 我不知道在VS2008中有没有办法将解决方案或项目定位到我安装的仅有SP1的3.5,而不是没有SP1的3.5。
如果我们使用了3.5 w/o SP1中没有的函数或构造函数,代码将无法正常工作。
也就是说,我想在编译时检测哪些内容需要SP1才能正常工作。
到目前为止,我们已经进行了测试(在虚拟机或单独的机器上),以查看应用程序是否会出现故障。当我们使用了API的部分功能直到SP1才可用时,它确实会出现故障。问题是,它只有在代码实际运行(在运行时)时才会出现故障,而不是在加载程序集时。
一种解决方案是拥有一个没有SP1的VS2008机器并尝试编译该项目。但我更喜欢一些工具来帮助我检测对3.5 SP1的依赖关系(由于使用了新的API或其他原因),无论是通过分析源代码还是我们生成的程序集。
我的谷歌搜索能力对这个问题不够强大,有什么提示吗?
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引用。

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

我刚刚尝试了 FxCop 1.36(独立版)。使用已知使用 SP1 API 的应用程序版本,我仍然无法找到 3.5SP1 的使用情况。 - L. Kolmodin

1

您可以使用在这里找到的代码来检测已安装的.NET Framework版本。


谢谢,但我已经知道安装的确切版本。这是一款内部产品,环境也很明确。我们遇到的问题是不要意外使用来自SP1的代码,因为工作站无法运行它。 - L. Kolmodin

0

string Fx35RegistryKey = @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5"; object Fx35ServicePack = Registry.GetValue(Fx35RegistryKey, "SP", null);

如果 (Fx35ServicePack == null || (int)Fx35ServicePack < 1) 则抛出异常(".NET Framework 3.5 SP1 是必需的。");


这与先前的答案类似,也仅在运行时起作用。我的问题主要是关于编译时期间的某些事情。 - L. Kolmodin

0

还有一个选项我还没有尝试过。Visual Studio documentation 上说你可以让你的 ClickOnce 安装程序专门针对 .NET 3.5SP1 框架。点击链接,搜索"Targeting .NET Framework Version 3.5 SP1"。基本上,它说以下任何一种方式都会强制安装程序安装 3.5SP1:

  • 在发布选项对话框中指定错误 URL。
  • 在发布选项对话框中指定套件名称。
  • 在发布选项对话框中创建桌面快捷方式。
  • 在应用程序文件对话框中排除一个文件的哈希值。
  • 在签名页上取消选中"Sign the ClickOnce manifests"复选框。
  • 添加对 System.Data.Entity 组件的引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接