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

时间:2010-11-30 14:56:24

标签: 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。

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 = _azApplication.InitializeClientContextFromStringSid(member, 0);

其中变量成员是包含来自用户的Windows Active Directory SID的字符串,_azApplication的类型为IAzApplication。

clientContext.GetRoles()

其中clientContext的类型为IAzClientContext。

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

1 个答案:

答案 0 :(得分:6)

看起来InitializeClientContextFromStringSid在规范中有一个可选参数。虽然.Net Framework 4.0中的MSBuild支持在C#中使用可选参数,允许您将它们从函数调用中移除,但以前版本的MSBuild不支持此方法。因此,即使在使用旧版本的Framework构建时未使用参数,也必须提供参数。

HRESULT InitializeClientContextFromStringSid(
  [in]            BSTR SidString,
  [in]            LONG lOptions,
  [in, optional]  VARIANT varReserved,
  [out]           IAzClientContext **ppClientContext
);

GetRoles方法也出现了同样的问题。

根据我的理解,您可以使用4.0版本的MSBuild和目标3.5 Framework构建的原因是CLR已经支持使用Optional参数,例如VB.NET始终支持它们。但是,在使用MSBuild 3.5时,它将使用较旧的规则/规范,这些规则/规范不允许在C#中支持Optional参数,因此会给您构建错误。