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.
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. –
ajouté l'information d'exception –
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. –