我的项目使用MSBuild 4生成,但不使用MSBuild 3.5,即使我';我的目标是相同版本的.NET Framework(3.5)?

我的项目使用MSBuild 4生成,但不使用MSBuild 3.5,即使我';我的目标是相同版本的.NET Framework(3.5)?,msbuild,azman,msbuild-4.0,Msbuild,Azman,Msbuild 4.0,当我使用MSBuild 4构建解决方案时,它会成功编译: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe MySolution.sln 构建成功 0 Warning(s) 0 Error(s) 但是,当我尝试使用MSBuild 3.5执行相同操作时,会出现以下错误,即使源代码相同,并且我使用的是相同的库和相同版本的.NET Framework HRESULT InitializeClientContextFromStringS

当我使用MSBuild 4构建解决方案时,它会成功编译:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe MySolution.sln

构建成功

0 Warning(s)
0 Error(s)
但是,当我尝试使用MSBuild 3.5执行相同操作时,会出现以下错误,即使源代码相同,并且我使用的是相同的库和相同版本的.NET Framework

HRESULT InitializeClientContextFromStringSid(
  [in]            BSTR SidString,
  [in]            LONG lOptions,
  [in, optional]  VARIANT varReserved,
  [out]           IAzClientContext **ppClientContext
);
C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe MySolution.sln

错误CS1501:方法'InitializeClientContextFromStringSid'没有采用'2'参数的重载

错误CS1501:方法“GetRoles”没有采用“0”参数的重载

我得到的错误与授权管理器(AzMan)有关

第一个错误中的方法“InitializeClientContextFromStringSid”属于公共接口IAzApplication,它是Microsoft.Interop.Security.AzRoles的成员

第二个错误中的方法“GetRoles”属于公共接口IAzClientContext,也是Microsoft.Interop.Security.AzRoles的成员

我以以下方式使用这些方法:

var clientContext=\u aApplication.InitializeClientContextFromStringSid(成员,0)

其中,变量成员是一个字符串,其中包含来自用户的Windows Active Directory SID,并且应用程序的类型为IAzApplication

clientContext.GetRoles()

其中clientContext的类型为IAzClientContext


为什么我的解决方案使用MSBuild 4而不是MSBuild 3.5生成,即使我的目标是相同版本的.NET Framework(3.5)?

看起来
InitializeClientContextFromStringSid
在规范中有一个可选参数。尽管.Net Framework 4.0中的MSBuild支持在C#中使用可选参数,允许您在函数调用中忽略这些参数,但以前版本的MSBuild不支持这种方法。因此,即使在使用较旧版本的框架构建时未使用该参数,也必须提供该参数

HRESULT InitializeClientContextFromStringSid(
  [in]            BSTR SidString,
  [in]            LONG lOptions,
  [in, optional]  VARIANT varReserved,
  [out]           IAzClientContext **ppClientContext
);
同样的问题也发生在
GetRoles
方法中


据我所知,可以使用4.0版本的MSBuild和目标3.5框架进行构建的原因是CLR已经支持使用可选参数,例如VB.NET一直支持它们。但是,当使用MSBuild 3.5时,它将使用旧的规则/规范,这些规则/规范不允许在C#中支持可选参数,因此会给您带来生成错误。

嗨,Goronmon,感谢您尝试帮助我。但问题是我没有使用.NET4.0。我在这两种情况下都使用.NET 3.5。如果在4.0下使用MSBuild,它将在该规范下编译。尝试对这两个函数的可选参数使用伪变量,并查看是否使用3.5版本的MSBuild编译它们。是的,它可以编译。但是,如果目标框架设置为3.5,为什么它的行为会因我使用的MSBuild版本而异呢。我认为不管我使用的MSBuild版本是什么,它的编译都会完全相同。除非我遗漏了什么。对在C#中使用可选参数的支持是在.Net Framework 4.0中添加的。但是,VB.net在技术上已经支持可选参数,因此您可以针对Framework 3.5使用可选参数,因为CLR始终支持它们。但是,3.5中的MSBuild将使用旧的C#规则/规范,它不正确支持可选参数,因此会给您带来编译错误。这不是一个bug。正如我所说,.NET Framework在技术上始终支持可选参数,例如VB.NET。然而,以前的C#编译器没有,因为它不是规范的一部分。这在4.0中发生了更改,因此4.0版本的MSBuild在使用可选参数时不会产生错误,而以前的版本(如3.5)会产生错误。编译后,CLR处理可选参数没有问题,因为它一直支持这些参数,只是编译器本身不支持。