/// <summary> /// Initializes a new instance of the <see cref="VisualizerAttributeInjector"/> class. /// </summary> /// <param name="targetVisualizerAssemblyPath">The assembly debugger visualizer location.</param> /// <param name="targetVsVersion">The targeted Visual Studio version</param> /// <exception cref="System.IO.FileNotFoundException"></exception> public VisualizerAttributeInjector(string targetVisualizerAssemblyPath, string targetVsVersion) { if (!FS.FileSystem.File.Exists(targetVisualizerAssemblyPath)) { throw new FileNotFoundException( $"Assembly doesn't exist at location {targetVisualizerAssemblyPath}"); } //usually vsVersion has this format 15.0 so I'm only interested in the first part string versionNumber = targetVsVersion.Split('.').FirstOrDefault(); int.TryParse(versionNumber, out int vsVersion); if (vsVersion == 0) { throw new ArgumentException($"Visual Studio version is incorrect {_targetVsVersion}"); } _targetVsVersion = vsVersion; //create pdb info if logging or error tracking is enabled bool createPdbInfo = CommonRegistryConfigurations.IsLoggingEnabled(targetVsVersion); createPdbInfo |= CommonRegistryConfigurations.IsErrorTrackingEnabled(targetVsVersion); _writerParameters = new WriterParameters { WriteSymbols = createPdbInfo, SymbolWriterProvider = createPdbInfo ? new PdbWriterProvider() : null }; ReaderParameters readerParameters = new ReaderParameters { AssemblyResolver = GetAssemblyResolver(targetVisualizerAssemblyPath), ReadingMode = ReadingMode.Immediate, SymbolReaderProvider = createPdbInfo ? new PdbReaderProvider() : null, InMemory = true, ReadSymbols = createPdbInfo, ThrowIfSymbolsAreNotMatching = false, }; //using a stream is better for testing _assemblyStream = FS.FileSystem.File.OpenRead(targetVisualizerAssemblyPath); _debuggerVisualizerAssembly = AssemblyDefinition.ReadAssembly(_assemblyStream, readerParameters); InitializeDebuggerAssembly(); RemapAssembly(); }
public void Init() { Isolate.WhenCalled(() => FS.FileSystem).WillReturn(MockFileSystem); object[] args = { AssemblyToInjectLocation, FileMode.Open, FileAccess.ReadWrite, FileShare.Read }; Stream access = FS.FileSystem.File.Open(AssemblyToInjectLocation, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); Isolate.NonPublic.WhenCalled(typeof(ModuleDefinition), "GetFileStream") .WithExactArguments(args) .WillReturn(access); Isolate.WhenCalled(() => CommonRegistryConfigurations.Map3RdPartyAssembly("", "")).WillReturn(false); Isolate.WhenCalled(() => CommonRegistryConfigurations.IsErrorTrackingEnabled("")).WillReturn(false); Isolate.WhenCalled(() => CommonRegistryConfigurations.IsLoggingEnabled("")).WillReturn(false); }
public static void Write(string msg, params object[] args) { if (string.IsNullOrEmpty(VisualStudioVersion)) { return; } if (!CommonRegistryConfigurations.IsLoggingEnabled(VisualStudioVersion)) { return; } try { InternalWrite(msg, args); } catch { // ignored } }
public void Init() { Isolate.WhenCalled(() => FS.FileSystem).WillReturn(new MockFileSystem()); Isolate.WhenCalled(() => CommonRegistryConfigurations.IsErrorTrackingEnabled("")).WillReturn(false); Isolate.WhenCalled(() => CommonRegistryConfigurations.IsLoggingEnabled("")).WillReturn(false); }