private void CreateDebuggerVisualizer() { try { Log.Write("Visualizer Assembly location {0}", _dynamicVisualizerDllAssemblyPath); VisualizerAttributeInjector attributeInjector = new VisualizerAttributeInjector(_dynamicVisualizerDllAssemblyPath, VisualStudioVer); attributeInjector.MapTypesFromAssembly(Assembly); string targetInstallationFilePath = Path.Combine(VisualizerDestinationFolder, TargetVisualizerAssemblyName); attributeInjector.SaveDebuggerVisualizer(targetInstallationFilePath); Log.Write("Assembly {0} Mapped", Assembly); } catch (Exception e) { BuildErrorEventArgs errorEvent = new BuildErrorEventArgs("Debugger Visualizer Creator", "", "MapperBuildTask", 0, 0, 0, 0, $"There was an error creating custom debugger visualizers for project {Assembly}", "", "LINQBridgeVs"); BuildEngine.LogErrorEvent(errorEvent); const string errorMessage = "Error creating debugger visualizers"; Log.Write(e, errorMessage); e.Capture(VisualStudioVer, message: errorMessage); } }
public void Visualizer_MapTypeFromAssembly_Should_Map_All_Types() { string debuggerVisualizerTargetName = Path.Combine(_thisAssemblyDirectoryName, "TestC.dll"); string visualizerLocation = typeof(DynamicObjectSource).Assembly.Location; VisualizerAttributeInjector injector = new VisualizerAttributeInjector(visualizerLocation, "11.0"); injector.MapTypesFromAssembly(_thisAssemblyLocation); injector.SaveDebuggerVisualizer(debuggerVisualizerTargetName); AssemblyDefinition generatedAssembly = AssemblyDefinition.ReadAssembly(debuggerVisualizerTargetName); IEnumerable <Type> currentAssemblytypes = GetType() .Assembly .GetTypes() .Where(typeDef => typeDef.IsPublic && !typeDef.IsInterface && !typeDef.IsAbstract); IEnumerable <string> mappedTypeNames = generatedAssembly .CustomAttributes .SelectMany(p => p.Properties.Where(n => n.Name.Equals("TargetTypeName")) .Select(l => l.Argument.Value.ToString())); bool allTypesArePresent = currentAssemblytypes .All(type => mappedTypeNames.Any(mappedType => mappedType.Equals(type.AssemblyQualifiedName))); Assert.IsTrue(allTypesArePresent); }
/// <summary> /// Maps the dot net framework types. If the file already exists for a given vs version it won't be /// regenerated. /// </summary> /// <param name="targetFilePath">The target visualizer installation path.</param> public void MapDotNetFrameworkTypes(string targetFilePath) { if (targetFilePath == null) { throw new ArgumentException(@"Target folder cannot be null", nameof(targetFilePath)); } if (string.IsNullOrEmpty(_dynamicVisualizerDllAssemblyPath)) { throw new ArgumentException(@"Visualizer Assembly Location cannot be null", nameof(_dynamicVisualizerDllAssemblyPath)); } VisualizerAttributeInjector visualizerInjector = new VisualizerAttributeInjector(_dynamicVisualizerDllAssemblyPath, VisualStudioVer); //Map all the possible System types IEnumerable <Type> systemLinqTypes = typeof(IOrderedEnumerable <>).Assembly .GetTypes() .Where(type => type != null && ( (type.IsClass && type.IsSerializable) || type.IsInterface || type.Name.Contains("Iterator") ) && !(type.Name.Contains("Func") || type.Name.Contains("Action")) && !string.IsNullOrEmpty(type.Namespace)); //Map all the possible list types IEnumerable <Type> systemGenericsTypes = typeof(IList <>).Assembly .GetTypes() .Where(type => type != null && ( (type.IsClass && type.IsSerializable) || type.IsInterface ) && !string.IsNullOrEmpty(type.Namespace) && type.IsPublic) .Where(type => !type.Name.Contains("ValueType") && !type.Name.Contains("IFormattable") && !type.Name.Contains("IComparable") && !type.Name.Contains("IConvertible") && !type.Name.Contains("IEquatable") && !type.Name.Contains("Object") && !type.Name.Contains("ICloneable") && !type.Name.Contains("String") && !type.Name.Contains("IDisposable")); systemLinqTypes.ForEach(visualizerInjector.MapType); systemGenericsTypes.ForEach(visualizerInjector.MapType); visualizerInjector.SaveDebuggerVisualizer(targetFilePath); }
private void CreateDebuggerVisualizer(string targetInstallationPath, string dynamicVisualizerSourceAssemblyPath) { Log.Write("Visualizer Assembly location {0}", dynamicVisualizerSourceAssemblyPath); VisualizerAttributeInjector attributeInjector = new VisualizerAttributeInjector(dynamicVisualizerSourceAssemblyPath); attributeInjector.MapTypesFromAssembly(Assembly); string targetInstallationFilePath = Path.Combine(targetInstallationPath, TargetVisualizerAssemblyName); attributeInjector.SaveDebuggerVisualizer(targetInstallationFilePath); Log.Write("Assembly {0} Mapped", Assembly); }
private void Create3RdPartyVisualizers() { try { if (!CommonRegistryConfigurations.Map3RdPartyAssembly(SolutionName, VisualStudioVer)) { return; } IEnumerable <string> assemblies = Crawler.FindDependencies(ProjectPath); foreach (string assemblyPath in assemblies) { string assemblyName; try { assemblyName = Path.GetFileNameWithoutExtension(assemblyPath); } catch { continue; //in case it is not a well formed path } //visualizer target name based on visual studio version string targetAssemblyName = VisualizerAssemblyNameFormat.GetTargetVisualizerAssemblyName(VisualStudioVer, assemblyName); string targetInstallationFilePath = Path.Combine(VisualizerDestinationFolder, targetAssemblyName); //no need to recreate the 3rd party assembly all the time if (FS.FileSystem.File.Exists(targetInstallationFilePath)) { continue; } VisualizerAttributeInjector attributeInjector = new VisualizerAttributeInjector(_dynamicVisualizerDllAssemblyPath, VisualStudioVer); attributeInjector.MapTypesFromAssembly(assemblyPath); attributeInjector.SaveDebuggerVisualizer(targetInstallationFilePath); } } catch (Exception e) { const string errorMessage = "Error Mapping 3rd Party Assemblies"; Log.Write(e, errorMessage); BuildWarningEventArgs errorEvent = new BuildWarningEventArgs("Debugger Visualizer Creator", "", "MapperBuildTask", 0, 0, 0, 0, $"There was an error creating custom debugger visualizers for 3rd Party Assemblies. Disable it in Tools->Options->BridgeVs->Map3RdPartyAssembly", "", "LINQBridgeVs"); BuildEngine.LogWarningEvent(errorEvent); e.Capture(VisualStudioVer, message: errorMessage); } }
public void Visualizer_MapType_Should_Create_DegguberVisualizerAttribute_OfType_IList_In_Target_Assembly() { string debuggerVisualizerTargetName = Path.Combine(_thisAssemblyDirectoryName, "TestB.dll"); string visualizerLocation = typeof(DynamicObjectSource).Assembly.Location; VisualizerAttributeInjector injector = new VisualizerAttributeInjector(visualizerLocation, "11.0"); injector.MapType(typeof(IList <>)); injector.SaveDebuggerVisualizer(debuggerVisualizerTargetName); AssemblyDefinition generatedAssembly = AssemblyDefinition.ReadAssembly(debuggerVisualizerTargetName); IEnumerable <object> mappedTypeNames = generatedAssembly .CustomAttributes .SelectMany(p => p.Properties.Where(n => n.Name.Equals("TargetTypeName")) .Select(l => l.Argument.Value)); Assert.IsTrue(mappedTypeNames.Contains(typeof(IList <>).AssemblyQualifiedName), "Mapping was not successful"); }
public void Visualizer_MapType_Should_Create_DegguberVisualizerAttribute_OfType_This_In_Target_Assembly() { var debuggerVisualizerTargetName = Path.Combine(_thisAssemblyDirectoryName, "TestA.dll"); var visualizerLocation = typeof(DynamicDebuggerVisualizerObjectSourceV11).Assembly.Location; var injector = new VisualizerAttributeInjector(visualizerLocation); injector.MapType(GetType()); injector.SaveDebuggerVisualizer(debuggerVisualizerTargetName); var generatedAssembly = AssemblyDefinition.ReadAssembly(debuggerVisualizerTargetName); var mappedTypeNames = generatedAssembly .CustomAttributes .SelectMany(p => p.Properties.Where(n => n.Name.Equals("TargetTypeName")) .Select(l => l.Argument.Value)); Assert.IsTrue(mappedTypeNames.Contains(GetType().AssemblyQualifiedName), "Mapping was not succesful"); }