是否有可能假装是比实际版本低的.net版本?

本文关键字:版本 net 有可能 假装 是否 | 更新日期: 2023-09-27 18:10:25

Sharepoint 2010在一个地方有一个版本检查(也从一些更新WSS 3.0开始有这样的检查):

...
Version version = Environment.Version;
if (version.Major > 2)
{
    ...
    throw new PlatformNotSupportedException(@string);

我知道,我不应该这样做,但只是出于好奇-有没有可能克服这个问题,而不写庞大的代理?

只是出于好奇,想知道是否有可能做到这些:

  1. 在运行时调整sharepoint的dll中的检查以通过(类,正在使用它是密封的和内部的,如果你好奇,它是Microsoft.SharePoint.Administration.SPConfigurationDatabase类在Microsoft.Sharepoint.dll)
  2. 临时覆盖环境。版本返回值,类似于:

    using (new EnvironmentVersionOverride("2.0")) { ... }

  3. 其他方式?

更新:Environment.Version反编译源码:

public static Version Version
{
  get
  {
    return new Version("4.0.30319.18444");
  }
}

是否有可能假装是比实际版本低的.net版本?

首先,WSS 3.0/Share Point 2010的创建使得微软的工程师确切地知道WSS 3.0/Share Point 2010将在哪个版本的公共语言运行库(CLR)上运行而不会出现错误。

如上所述,Environment.Version返回当前加载在进程中的CLR版本(而不是 . net框架版本)。没有办法"伪造"或"代理"这个值。如果你在Windows 7、Windows Server 2008或Windows Server 2008 R2机器上运行SharePoint,那么CLR 2.0会自动安装(但我不确定Windows 8或Windows Server 2012是否会安装)。

在我看来,你需要确保IIS中的应用程序池,其中sharepoint 2010(或WSS 3.0)网站正在使用。net Framework Version 2.0.50727(这意味着使用CLR 2.0)。如前所述,当使用。net Framework 4.0的应用程序池时,sharepoint 2010将直接拒绝运行。

如果运行sharepoint 2010/WSS 3.0的机器没有安装。net Framework 3.5 SP1(包括CLR 2.0),安装它并确保应用程序池设置正确应该可以解决您的问题,您不需要"代理"Environment.Version的值。

如果你想创建一个供sharepoint 2010使用的库,那么确保你的库的目标是。net Framework 3.5