2010-11-30 34 views
3

Quand je construis ma solution à l'aide MSBuild 4 compile avec succès:Mon projet est construit avec MSBuild 4 mais pas avec MSBuild 3.5 même si je cible la même version du .NET Framework (3.5)?

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

Construire réussi.

0 Warning(s) 
0 Error(s) 

Mais lorsque je tente de faire la même chose en utilisant MSBuild 3.5 Je reçois l'erreur suivante, même si la source est le même et je me sers les mêmes bibliothèques et la même version du .NET Framework.

C: \ Windows \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe MySolution.sln

CS1501 d'erreur: Aucune surcharge pour la méthode 'InitializeClientContextFromStringSid' prend des arguments '2'

erreur CS1501: Pas de surcharge pour 'GetRoles' méthode prend des arguments '0'

L'erreur que je reçois est lié à Gestionnaire d'autorisations (AzMan).

La méthode 'InitializeClientContextFromStringSid' dans la première erreur appartient à l'interface publique IAzApplication, membre de Microsoft.Interop.Security.AzRoles.

La méthode 'GetRoles' dans la seconde erreur appartient à l'interface publique IAzClientContext, également membre de Microsoft.Interop.Security.AzRoles.

J'utilise les méthodes de la manière suivante:

var clientContext = _azApplication.InitializeClientContextFromStringSid(member, 0);

où le membre variable est une chaîne contenant l'Active Directory de Windows SID d'un utilisateur et _azApplication est de type IAzApplication.

clientContext.GetRoles()

où ClientContext est de type IAzClientContext.

Pourquoi ma solution est-elle construite avec MSBuild 4 mais pas avec MSBuild 3.5 même si je cible la même version de .NET Framework (3.5)?

Répondre

6

Il semble que InitializeClientContextFromStringSid ait un paramètre facultatif dans la spécification. Bien que MSBuild dans .Net Framework 4.0 prenne en charge l'utilisation de paramètres facultatifs dans C# en vous permettant de les laisser hors de l'appel de fonction, les versions précédentes de MSBuild ne prennent pas en charge cette approche. Vous devez donc fournir le paramètre même s'il n'est pas utilisé lors de la construction d'une ancienne version du Framework.

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

Le même problème se produit avec la méthode GetRoles. D'après ce que je comprends, la raison pour laquelle vous pouvez construire en utilisant la version 4.0 de MSBuild et la cible 3.5 Framework est que le CLR supporte déjà l'utilisation de paramètres optionnels, par exemple VB.NET les a toujours supportés. Toutefois, lors de l'utilisation de MSBuild 3.5, il utilisera les anciennes règles/spécifications qui ne permettaient pas la prise en charge des paramètres facultatifs en C# et vous donneront donc des erreurs de construction.

+0

Bonjour Goronmon, merci d'avoir essayé de m'aider. Mais le problème est que je n'utilise pas .NET 4.0. J'utilise .NET 3.5 dans les deux cas. – macrobug

+1

Si vous utilisez MSBuild sous 4.0, il va compiler sous cette spécification. Essayez d'utiliser des variables factices pour les paramètres optionnels pour ces deux fonctions et voyez si elles les compilent en utilisant la version 3.5 de MSBuild. – Goronmon

+0

Oui, il compile. Mais pourquoi se comporte-t-il différemment selon la version MSBuild que j'utilise si le Framework cible est défini sur 3.5. Je pensais qu'il compilerait exactement la même chose indépendamment de la version de MSBuild que j'utilise. À moins qu'il y ait quelque chose qui me manque. – macrobug