EnvDTE генерирует исключение ComException при попытке получить модификатор доступа к свойству члена с выражением
У меня есть проект расширения VS.
В проекте мне нужно пройти через все классы и найти все публичные свойства с публичными получателями.
код выглядит так
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)
};
}
следующий вход вызывает проблему
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);
}
}
прекрасно работает, пока не доберется до
public string WindowsUserID => $"{Domain}\\{UserName}";
где это взрывается на vsCMAccess.vsCMAccessPublic == p.Getter.Access с COMException.
трассировка стека в System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) в Microsoft.VisualStudio.LanguageServices.Implementation.Utilities.Exceptions.ThrowEFail() в Microsoft.VisualStudio.Lodeagelault.ModeHe fCharpSecCS.CS Узел SyntaxNode) в узле Microsoft.VisualStudio.LanguageServices.CSharp.CodeModel.CSharpCodeModelService.GetAccess(узел SyntaxNode) в узле Microsoft.VisualStudio.LanguageServices.Implementation.CodeModel.InternalElements.CodeAccessEgn.EccessEccessFase () IntellisenseParser.IsPublic(CodeFunction cf) в C:\code\GitHub\TypeScriptDefinitionGenerator\src\Generator\IntellisenseParser.cs: строка 190
HResult = 0x80004005
Сообщение "Ошибка HRESULT E_FAIL была возвращена от вызова к компоненту COM
Источник "EnvDTE"
TargetSite {EnvDTE.vsCMAccess get_Access ()}
все свойства, на которых это происходит, - все члены с выраженным выражением
Является ли проблема EnvDTE?
Если это проблема EnvDTE.... как / где мне сообщить об этом.
1 ответ
Хорошо, я поставил ошибку и исправил в Roslyn.... это запланировано на выпуск 15.3