是否有可能伪装成比实际更低的.NET版本?

时间:2014-06-27 06:45:41

标签: c#

Sharepoint 2010在单个位置进行了版本检查(也从某些更新开始,WSS 3.0也进行了此类检查):

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

我知道,我不应该这样做,但出于好奇 - 是否有可能在没有编写巨大代理的情况下克服这个问题?

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

  1. 在运行时调整sharepoint的dll中的这个检查来传递(类,使用它是密封的和内部的,如果你很好奇,它是Microsoft.Sharepoint.dll中的Microsoft.SharePoint.Administration.SPConfigurationDatabase类)
  2. 临时覆盖Environment.Version返回值,如:

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

  3. 其他一些方式?
  4. 更新: Environment.Version反编译来源:

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

1 个答案:

答案 0 :(得分:1)

首先,创建了WSS 3.0 / Share Point 2010,以便Microsoft的工程师确切知道哪个版本的公共语言运行时(CLR)WSS 3.0 / Share Point 2010可以正确运行。

如上所述,Environment.Version返回当前在您的进程中加载​​的CLR版本( .NET Framework版本)。没有办法“伪造”或“代理”这个值。如果您在Windows 7,Windows Server 2008或Windows Server 2008 R2计算机上运行SharePoint,则会自动安装CLR 2.0(不过我不确定Windows 8或Windows Server 2012)。

在我看来,您需要确保运行Share Point 2010(或WSS 3.0)网站的IIS中的应用程序池正在使用.Net Framework版本2.0.50727(这意味着使用CLR 2.0) )。如上所述here,当它的网站使用面向.NET Framework 4.0的应用程序池时,Share Point 2010将拒绝运行。

如果运行Share Point 2010 / WSS 3.0的计算机没有安装.NET Framework 3.5 SP1(包括CLR 2.0),安装它并确保应用程序池设置正确可以解决您的问题,您将不需要“代理”Environment.Version的价值。

如果您正在尝试创建供Share Point 2010使用的库,请确保您的库的目标是.NET Framework 3.5。