2017-05-12 9 views
0

J'ai un projet d'extension VS.EnvDTE lance une exception ComException lors de la tentative d'obtention d'un modificateur d'accès à la propriété d'un membre à corps d'expression

Dans le projet, je dois traverser toutes les classes et trouver toutes les propriétés publiques avec des getters publics.

le code ressemble

 private static IEnumerable<IntellisenseProperty> GetProperties(CodeElements props, HashSet<string> traversedTypes, HashSet<string> references = null) 
     { 
      return from p in props.OfType<CodeProperty>() 
        where !p.Attributes.Cast<CodeAttribute>().Any(a => "System.Runtime.Serialization.IgnoreDataMemberAttribute" == a.FullName || "Newtonsoft.Json.JsonIgnoreAttribute" == a.FullName) 
        where vsCMAccess.vsCMAccessPublic == p.Access && p.Getter != null && !p.Getter.IsShared && vsCMAccess.vsCMAccessPublic == p.Getter.Access 
        select new IntellisenseProperty 
        { 
         Name = GetName(p), 
         Type = GetType(p.Parent, p.Type, traversedTypes, references), 
         Summary = GetSummary(p), 
         JsonName = GetJsonName(p) 
        }; 
     } 

l'entrée suivante causent le problème

sing System.ComponentModel.DataAnnotations; 
using Microsoft.AspNet.Identity; 
using Newtonsoft.Json; 
using System.Runtime.Serialization; 

namespace ClaimsManager.Models.UI 
{ 
    public class WindowsAccount 
    {  
     [JsonProperty("Test")] 
     public string UserName { get; set; } 
     [Required] 
     public string Domain { get; set; } 

     public string WindowsUserID => $"{Domain}\\{UserName}"; 

     [JsonIgnore] 
     public UserLoginInfo UserLogin => new UserLoginInfo("Windows", WindowsUserID); 


    } 
} 

fonctionne très bien jusqu'à ce qu'il arrive à

public string WindowsUserID => $"{Domain}\\{UserName}"; 

où il explose sur vsCMAccess.vsCMAccessPublic = = p.Getter.Access avec une exception COMException.

pile trace à System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal (Int32 errorCode, IntPtr errorInfo) à Microsoft.VisualStudio.LanguageServices.Implementation.Utilities.Exceptions.ThrowEFail() à Microsoft.VisualStudio.LanguageServices.CSharp .CodeModel.CSharpCodeModelService.GetDefaultAccessibility (nœud de SyntaxNode) à Microsoft.VisualStudio.LanguageServices.CSharp.CodeModel.CSharpCodeModelService.GetAccess (nœud de SyntaxNode) à Microsoft.VisualStudio.LanguageServices.Implementation.CodeModel.InternalElements.CodeAccessorFunction.get_Access() à EnvDTE.CodeFunction.get_Access() à TypeScriptDefinitionGenerator.IntellisenseParser.IsPu BLIC (CodeFunction cf) dans C: \ Code \ GitHub \ TypeScriptDefinitionGenerator \ src \ Générateur \ IntellisenseParser.cs: ligne 190

HResult = 0x80004005

message « Erreur HRESULT E_FAIL a été renvoyé par un appel à un COM composante

Source "EnvDTE"

TargetSite {EnvDTE.vsCMAccess get_Access()}

les propriétés que cela se produit sur tous les membres sont valides expression

Est-ce un problème EnvDTE?

Si c'est un problème EnvDTE .... comment/où dois-je le signaler.

+1

Il y a des milliers * * de différents types de COMExceptions. Il ne sert à rien de nous forcer à deviner lequel tu as. Au minimum le HResult, tout message que vous voyez. –

+0

ajouté l'information d'exception –

+0

donc l'accès a refusé .... mais ne dit vraiment rien ... le code d'entrée est un code valide, donc EnvDTE ne devrait pas exploser. –

Répondre

0

Ok je mets un bug et réparer dans Roslyn .... il est prévu pour le 15,3 version