/// <summary> /// Convert the block of native code into a CodeDom hierarchy /// </summary> /// <param name="code"></param> /// <param name="ep"></param> /// <returns></returns> /// <remarks></remarks> public CodeTypeDeclarationCollection ConvertNativeCodeToCodeDom(string code, ErrorProvider ep) { if (code == null) { throw new ArgumentNullException("code"); } if (ep == null) { throw new ArgumentNullException("ep"); } var analyzer = NativeCodeAnalyzerFactory.CreateForMiniParse(OsVersion.WindowsVista, _storage.GetAllMacros()); // TODO: probably should delete this analyzer.IncludePathList.Add("c:\\program files (x86)\\windows kits\\8.1\\include\\shared"); NativeSymbolBag bag = default(NativeSymbolBag); using (System.IO.StringReader reader = new StringReader(code)) { NativeCodeAnalyzerResult result = analyzer.Analyze(reader); ep.Append(result.ErrorProvider); bag = NativeSymbolBag.CreateFrom(result, Storage); } return(ConvertBagToCodeDom(bag, ep)); }
private static BasicSymbolStorage Generate(TextWriter writer) { NativeCodeAnalyzer analyzer = NativeCodeAnalyzerFactory.Create(OsVersion.WindowsVista); analyzer.IncludePathList.AddRange(NativeCodeAnalyzerFactory.GetCommonSdkPaths()); // Run the preprocessor analyzer.Trace = true; string winPath = Path.Combine(PInvoke.Parser.NativeCodeAnalyzerFactory.GetPlatformSdkIncludePath(), "windows.h"); TextReaderBag tr = analyzer.RunPreProcessor(winPath); File.WriteAllText("d:\\temp\\windows.out.h", tr.TextReader.ReadToEnd()); analyzer.Trace = false; NativeCodeAnalyzerResult result = analyzer.Analyze(winPath); ErrorProvider ep = result.ErrorProvider; if (ep.Errors.Count > 0) { Debug.Fail("Encountered an error during the parse"); } NativeSymbolBag bag = NativeSymbolBag.CreateFrom(result, CreateInitialBasicSymbolStorage(), ep); // Resolve with the full dll list using (ProcedureFinder finder = new ProcedureFinder(FullDllList)) { bag.TryResolveSymbolsAndValues(finder, ep); } foreach (string msg in ep.AllMessages) { writer.WriteLine("' " + msg); } // GenerateCode(writer, bag) // Now write out the file var ns = new BasicSymbolStorage(); bag.SaveToNativeStorage(ns); VerifyGeneratedStorage(ns); // TODO: need to write to file again otherwise it's just in memory. // Copy the file to the various applications File.Copy("windows.xml", "..\\..\\..\\ConsoleTool\\bin\\Debug\\windows.xml", true); File.Copy("windows.xml", "..\\..\\Data\\windows.xml", true); string fullInstallTarget = Path.Combine(Environment.GetEnvironmentVariable("ProgramFiles"), Path.Combine(PInvoke.Constants.ProductName, "Data\\windows.xml")); if (File.Exists(fullInstallTarget)) { File.Copy("windows.xml", fullInstallTarget, true); } return(ns); }