public static void SaveVsComObjects(this SdkInterfaceLibraryEntities entities, Process process, object obj, string serviceName, string packageName, string typeName) { var type = obj.GetType(); var pUnk = Marshal.GetIUnknownForObject(obj); foreach (var assemblyRef in Assembly.GetExecutingAssembly().GetReferencedAssemblies()) { if (assemblyRef.Name.StartsWith("Microsoft.VisualStudio.", "EnvDTE")) { var assembly = Assembly.Load(assemblyRef); foreach (var refType in assembly.GetTypes().Where(t => t.IsInterface && t.HasCustomAttribute <GuidAttribute>())) { if (type.Implements(refType)) { var interfaceId = entities.GetInterfaceId(refType); if (serviceName != null) { var tblService = entities.SaveIfNotExists <tblService>(s => s.ServiceName == serviceName, () => { return(new tblService { ServiceId = Guid.NewGuid(), ServiceName = serviceName, ComponentId = entities.CreateComponent(type, Guid.Empty, process, obj).ComponentId }); }); } else if (packageName != null) { Debugger.Break(); } } else { foreach (var guidAttr in refType.GetCustomAttributes <GuidAttribute>()) { var guid = Guid.Parse(guidAttr.Value); IntPtr ppv; if (Marshal.QueryInterface(pUnk, ref guid, out ppv) == VSConstants.S_OK) { var tblService = entities.SaveIfNotExists <tblService>(s => s.ServiceName == serviceName, () => { return(new tblService { ServiceId = Guid.NewGuid(), ServiceName = serviceName, ComponentId = entities.CreateComponent(type, Guid.Empty, process, obj).ComponentId }); }); } } } } } } }
public static void SaveVsComPackages(this SdkInterfaceLibraryEntities entities, Process process, IEnumerable <KeyValuePair <Guid, object> > objects) { foreach (var pair in objects) { var obj = pair.Value; var pUnk = Marshal.GetIUnknownForObject(pair.Value); var service = GetServiceFromGuid(pair.Key); entities.SaveVsComObjects(process, obj, service, string.Empty, string.Empty); } }
private static Guid GetInterfaceId(this SdkInterfaceLibraryEntities entities, Type refType) { var guidAttribute = refType.GetCustomAttribute <GuidAttribute>(); var guid = Guid.Parse(guidAttribute.Value); var tblInterface = entities.SaveIfNotExists <tblInterface>(i => i.InterfaceGuid == guid, () => { return(new tblInterface { InterfaceId = Guid.NewGuid(), InterfaceGuid = guid, InterfaceName = refType.FullName, }); }); return(tblInterface.InterfaceId); }
public static void SaveTypes(this SdkInterfaceLibraryEntities entities, Process process) { var executingAssembly = Assembly.GetExecutingAssembly(); var allTypes = executingAssembly.GetReferencedAssemblies().Where(r => r.Name.StartsWith("Microsoft.VisualStudio.", "EnvDTE.")).SelectMany(r => { try { var assembly = Assembly.Load(r); return(assembly.GetTypes()); } catch { return(new Type[0]); } }); foreach (var assemblyRef in executingAssembly.GetReferencedAssemblies()) { if (assemblyRef.Name.StartsWith("Microsoft.VisualStudio.", "EnvDTE.")) { var assembly = Assembly.Load(assemblyRef); foreach (var refType in assembly.GetTypes().Where(t => t.IsInterface && t.HasCustomAttribute <GuidAttribute>())) { foreach (var type in allTypes) { var assemblyName = string.Empty; var dllName = string.Empty; if (type.Name == "__ComObject") { var typeAssembly = type.Assembly; assemblyName = typeAssembly.GetNameParts().AssemblyName; dllName = typeAssembly.CodeBase; } if (type.Implements(refType)) { //writer.SaveLineFormat("{0},{1},{2},{3},{4},{5}", dllName, assemblyName, string.Empty, string.Empty, type, refType.FullName); } } } } } }
public static tblComponent CreateComponent(this SdkInterfaceLibraryEntities entities, Type type, Guid typeGuid, Process process, object objComponent) { var tblModule = GetModuleObject(type, process, objComponent); var tblComponent = new tblComponent { ComponentId = Guid.NewGuid(), ComponentType = entities.GetComponentTypeName(tblModule, type, typeGuid), ModuleId = entities.SaveIfNotExists <tblModule>(m => m.ModuleFileName == tblModule.ModuleFileName, () => { return(tblModule); }).ModuleId }; entities.tblComponents.AddObject(tblComponent); entities.SaveChanges(); return(tblComponent); }
public static void SaveAll(this SdkInterfaceLibraryEntities entities, Microsoft.VisualStudio.OLE.Interop.IServiceProvider serviceProvider, IEnumerable <KeyValuePair <Guid, object> > services = null, IEnumerable <KeyValuePair <Guid, object> > packages = null) { var process = Process.GetCurrentProcess(); entities.TruncateAll(); if (services != null) { entities.SaveVsComServices(process, services); } if (packages != null) { entities.SaveVsComPackages(process, packages); } entities.SaveServices(process, serviceProvider); entities.SaveTypes(process); entities.SaveChanges(); }
public static string GetComponentTypeName(this SdkInterfaceLibraryEntities entities, tblModule tblModule, Type type, Guid typeGuid) { if (tblModule.IsClrModule) { return(type.FullName); } else { var imageFile = tblModule.ModuleFileName; SetStatus("Searching for component type name for {0}", type.Name); if (tblModule.tblModuleSymbols.Count == 0) { SetStatus("Building symbol table for {0}. This may take several minutes.", tblModule.ModuleName); entities.BuildModuleSymbolsTable(tblModule); } throw new NotImplementedException(); } }
public static void SaveServices(this SdkInterfaceLibraryEntities entities, Process process, Microsoft.VisualStudio.OLE.Interop.IServiceProvider serviceProvider) { var executingAssembly = Assembly.GetExecutingAssembly(); foreach (var assemblyRef in executingAssembly.GetReferencedAssemblies()) { if (assemblyRef.Name.StartsWith("Microsoft.VisualStudio.", "EnvDTE.")) { var assembly = Assembly.Load(assemblyRef); foreach (var refType in assembly.GetTypes().Where(t => t.IsInterface && t.HasCustomAttribute <GuidAttribute>())) { var attr = refType.GetCustomAttribute <GuidAttribute>(); var guid = Guid.Parse(attr.Value); var IID_IUnknown = new Guid("00000000-0000-0000-C000-000000000046"); IntPtr pUnk; if (ErrorHandler.Succeeded(serviceProvider.QueryService(ref guid, ref IID_IUnknown, out pUnk))) { var serviceName = GetServiceFromGuid(guid); var obj = Marshal.GetObjectForIUnknown(pUnk); var tblService = entities.SaveIfNotExists <tblService>(s => s.ServiceName == serviceName, () => { return(new tblService { ServiceId = Guid.NewGuid(), ServiceName = serviceName, ComponentId = entities.CreateComponent(refType, Guid.Empty, process, obj).ComponentId }); }); entities.SaveVsComObjects(process, obj, serviceName, string.Empty, string.Empty); } } } } }
public SDKSymbolResolver() { var vcDirectory = new DirectoryInfo(VSEnvironment.ExpandEnvironmentVariables("$(VCInstallDir)")); var crtDirectory = new DirectoryInfo(VSEnvironment.ExpandEnvironmentVariables(@"$(VCInstallDir)crt\src")); var windowsSdkDirectory = new DirectoryInfo(VSEnvironment.ExpandEnvironmentVariables("$(WindowsSdkDir)")); var atlmfcDirectory = new DirectoryInfo(VSEnvironment.ExpandEnvironmentVariables(@"$(VCInstallDir)atlmfc")); var frameworkSdkDirectory = new DirectoryInfo(VSEnvironment.ExpandEnvironmentVariables(@"$(FrameworkSDKDir)")); var connectionString = SDKLibraryConnection.ConnectionString; logFile = new FileInfo(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "SDKSymbolResolver.log")); if (logFile.Exists) { logFile.Delete(); } versionRegex = new Regex(@"v?(?<version>\d+?\.\d+?\w*)"); lockObject = LockManager.CreateObject(); searchManager = new SearchManager(); searchManager.AddCatalog("MSVCInclude"); entities = new SdkInterfaceLibraryEntities(connectionString); tblSDKHeaderFiles = entities.tblSDKHeaderFiles; tblVendorSDKs = entities.tblVendorSDKs; HeaderEntityExtensions.Entities = entities; HeaderEntityExtensions.WriteLog += new EventHandlerT <string>(HeaderEntityExtensions_WriteLog); HeaderEntityExtensions.IndentLog += new EventHandler(HeaderEntityExtensions_IndentLog); HeaderEntityExtensions.OutdentLog += new EventHandler(HeaderEntityExtensions_OutdentLog); var tblMSVendor = entities.SaveIfNotExists <tblVendor>(v => v.VendorName == "Microsoft", () => { return(new tblVendor { VendorId = Guid.NewGuid(), VendorName = "Microsoft" }); }); if (crtDirectory.Exists) { var version = string.Empty; if (versionRegex.IsMatch(crtDirectory.FullName)) { var match = versionRegex.Match(crtDirectory.FullName); version = match.Groups["version"].Value; } var tblMSVendorSdk = entities.SaveIfNotExists <tblVendorSDK>(s => s.SdkName == "C Runtime Language" && s.SdkVersion == version, () => { return(new tblVendorSDK { VendorSdkId = Guid.NewGuid(), VendorId = tblMSVendor.VendorId, SdkName = "C Runtime Language", SdkVersion = version, SdkRootFolder = crtDirectory.FullName, IncludeFolders = string.Empty, SourceFolders = string.Empty, LibraryFolders = string.Empty, ExecutableFolders = string.Empty, }); }); } if (vcDirectory.Exists) { var version = string.Empty; if (versionRegex.IsMatch(vcDirectory.FullName)) { var match = versionRegex.Match(vcDirectory.FullName); version = match.Groups["version"].Value; } var tblMSVendorSdk = entities.SaveIfNotExists <tblVendorSDK>(s => s.SdkName == "Visual C++" && s.SdkVersion == version, () => { return(new tblVendorSDK { VendorSdkId = Guid.NewGuid(), VendorId = tblMSVendor.VendorId, SdkName = "Visual C++", SdkVersion = version, SdkRootFolder = vcDirectory.FullName, IncludeFolders = "include", SourceFolders = "src", LibraryFolders = "lib", ExecutableFolders = "bin", }); }); } if (windowsSdkDirectory.Exists) { var version = string.Empty; if (versionRegex.IsMatch(vcDirectory.FullName)) { var match = versionRegex.Match(windowsSdkDirectory.FullName); version = match.Groups["version"].Value; } var tblMSVendorSdk = entities.SaveIfNotExists <tblVendorSDK>(s => s.SdkName == "Windows SDK" && s.SdkVersion == version, () => { return(new tblVendorSDK { VendorSdkId = Guid.NewGuid(), VendorId = tblMSVendor.VendorId, SdkName = "Windows SDK", SdkVersion = version, SdkRootFolder = windowsSdkDirectory.FullName, IncludeFolders = "include", SourceFolders = "src", LibraryFolders = "lib", ExecutableFolders = "bin" }); }); } if (atlmfcDirectory.Exists) { var version = string.Empty; if (versionRegex.IsMatch(vcDirectory.FullName)) { var match = versionRegex.Match(atlmfcDirectory.FullName); version = match.Groups["version"].Value; } var tblMSVendorSdk = entities.SaveIfNotExists <tblVendorSDK>(s => s.SdkName == "ATL MFC" && s.SdkVersion == version, () => { return(new tblVendorSDK { VendorSdkId = Guid.NewGuid(), VendorId = tblMSVendor.VendorId, SdkName = "ATL MFC", SdkVersion = version, SdkRootFolder = atlmfcDirectory.FullName, IncludeFolders = "include", SourceFolders = "src", LibraryFolders = "lib", ExecutableFolders = "bin" }); }); } if (frameworkSdkDirectory.Exists) { var version = string.Empty; if (versionRegex.IsMatch(vcDirectory.FullName)) { var match = versionRegex.Match(frameworkSdkDirectory.FullName); version = match.Groups["version"].Value; } var tblMSVendorSdk = entities.SaveIfNotExists <tblVendorSDK>(s => s.SdkName == "Framework SDK" && s.SdkVersion == version, () => { return(new tblVendorSDK { VendorSdkId = Guid.NewGuid(), VendorId = tblMSVendor.VendorId, SdkName = "Framework SDK", SdkVersion = version, SdkRootFolder = frameworkSdkDirectory.FullName, IncludeFolders = "include", SourceFolders = "src", LibraryFolders = "lib", ExecutableFolders = "bin" }); }); } serializedEventArgs = new List <EventArgsXml>(); includeDirectories = new Dictionary <tblVendorSDK, DirectoryInfo>(); libraryDirectories = new Dictionary <tblVendorSDK, DirectoryInfo>(); tblVendorSDKs = entities.tblVendorSDKs; foreach (var tblVendorSdk in tblVendorSDKs) { AddIncludes(tblVendorSdk); } this.OnParserDiagnostic += new Utils.EventHandlerT <CppSharp.Parser.ParserDiagnostic>(symbolResolver_OnParserDiagnostic); this.OnParserProgress += new ParserProgressEventHandler(symbolResolver_OnParserProgress); }
private static void BuildModuleSymbolsTable(this SdkInterfaceLibraryEntities entities, tblModule tblModule) { var cvdump = @"C:\Projects\MC\RazorViewsDesigner\Microsoft.Pdb\cvdump\cvdump.exe"; var startInfo = new ProcessStartInfo(cvdump, string.Format("-p \"{0}\"", tblModule.ModuleFileName)); var output = string.Empty; var error = string.Empty; int exitCode; Process process; startInfo.CreateNoWindow = false; startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; process = new Process(); process.EnableRaisingEvents = true; process.StartInfo = startInfo; process.OutputDataReceived += (s, e) => { output += e.Data + "\r\n"; }; process.ErrorDataReceived += (s, e) => { error += e.Data + "\r\n"; }; process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); process.WaitForExit(); exitCode = process.ExitCode; //exitCode = 0; //output = File.ReadAllText(@"C:\Projects\MC\RazorViewsDesigner\Net2Html5Package\InterfaceLibrary\cvdump.txt"); //error = string.Empty; if (error.Trim().IsNullOrEmpty()) { var pattern = @"^S_PUB32: \[(?<segment>[\da-zA-Z]*?):(?<offset>[\da-zA-Z]*?)\], Flags: (?<flags>[\da-zA-Z]*?), (?<symbol>.*$)$"; var regex = new Regex(pattern); var lines = output.Split('\n', StringSplitOptions.RemoveEmptyEntries); foreach (var readLine in lines) { var line = readLine.Trim(); if (regex.IsMatch(line)) { var match = regex.Match(line.Trim()); var segment = match.Groups["segment"].Value; var offset = match.Groups["offset"].Value; var flags = match.Groups["flags"].Value; var symbol = match.Groups["symbol"].Value; var tblModuleSymbols = entities.tblModuleSymbols; var tblModuleSymbol = new tblModuleSymbol { ModuleSymbolId = Guid.NewGuid(), ModuleId = tblModule.ModuleId, Segment = segment, Offset = offset, Flags = flags, DecoratedSymbol = symbol, UndecoratedSymbol = UndecorateSymbol(symbol) }; tblModuleSymbols.AddObject(tblModuleSymbol); entities.SaveChanges(); } } } else { SetStatus("Errors from cvdump: \r\n\r\n{0}", error); } SetStatus("Exit code from cvdump: {0}", exitCode); }