/// <summary> /// Patches the file. /// </summary> /// <param name="file">The file.</param> public bool PatchFile(string file) { var fileTime = new FileTime(file); //var fileTimeInteropBuilder = new FileTime(Assembly.GetExecutingAssembly().Location); string checkFile = Path.GetFullPath(file) + ".check"; //string checkInteropBuilderFile = "InteropBuild.check"; // If checkFile and checkInteropBuilderFile up-to-date, then nothing to do if (fileTime.CheckFileUpToDate(checkFile)) { Log("Nothing to do. SharpDX patch was already applied for assembly [{0}]", file); return(false); } // Copy PDB from input assembly to output assembly if any var readerParameters = new ReaderParameters(); var writerParameters = new WriterParameters(); var pdbName = Path.ChangeExtension(file, "pdb"); if (File.Exists(pdbName)) { var symbolReaderProvider = new PdbReaderProvider(); readerParameters.SymbolReaderProvider = symbolReaderProvider; readerParameters.ReadSymbols = true; writerParameters.WriteSymbols = true; } // Read Assembly assembly = AssemblyDefinition.ReadAssembly(file, readerParameters); ((BaseAssemblyResolver)assembly.MainModule.AssemblyResolver).AddSearchDirectory(Path.GetDirectoryName(file)); foreach (var assemblyNameReference in assembly.MainModule.AssemblyReferences) { if (assemblyNameReference.Name.ToLower() == "mscorlib") { mscorlibAssembly = assembly.MainModule.AssemblyResolver.Resolve(assemblyNameReference); break; } } // TODO: Temporary patch to handle correctly 4.5 Core profile if (mscorlibAssembly == null) { foreach (var assemblyNameReference in assembly.MainModule.AssemblyReferences) { if (assemblyNameReference.Name == "System.Runtime") { ((BaseAssemblyResolver)assembly.MainModule.AssemblyResolver).AddSearchDirectory(Path.Combine(ProgramFilesx86(), @"Reference Assemblies\Microsoft\Framework\.NETCore\v4.5")); mscorlibAssembly = assembly.MainModule.AssemblyResolver.Resolve(assemblyNameReference); break; } } } if (mscorlibAssembly == null) { LogError("Missing mscorlib.dll from assembly {0}", file); throw new InvalidOperationException("Missing mscorlib.dll from assembly"); } // Import void* and int32 from assembly using mscorlib specific version (2.0 or 4.0 depending on assembly) voidType = mscorlibAssembly.MainModule.GetType("System.Void"); voidPointerType = new PointerType(assembly.MainModule.Import(voidType)); intType = assembly.MainModule.Import(mscorlibAssembly.MainModule.GetType("System.Int32")); // Remove CompilationRelaxationsAttribute for (int i = 0; i < assembly.CustomAttributes.Count; i++) { var customAttribute = assembly.CustomAttributes[i]; if (customAttribute.AttributeType.FullName == typeof(CompilationRelaxationsAttribute).FullName) { assembly.CustomAttributes.RemoveAt(i); i--; } } Log("SharpDX interop patch for assembly [{0}]", file); foreach (var type in assembly.MainModule.Types) { PatchType(type); } // Remove All Interop classes foreach (var type in classToRemoveList) { assembly.MainModule.Types.Remove(type); } var outputFilePath = file; assembly.Write(outputFilePath, writerParameters); fileTime = new FileTime(file); // Update Check file fileTime.UpdateCheckFile(checkFile); //fileTimeInteropBuilder.UpdateCheckFile(checkInteropBuilderFile); Log("SharpDX patch done for assembly [{0}]", file); return(true); }
/// <summary> /// Patches the file. /// </summary> /// <param name="file">The file.</param> public bool PatchFile(string file) { file = Path.Combine(Environment.CurrentDirectory, file); var fileTime = new FileTime(file); //var fileTimeInteropBuilder = new FileTime(Assembly.GetExecutingAssembly().Location); string checkFile = Path.GetFullPath(file) + ".check"; //string checkInteropBuilderFile = "InteropBuild.check"; // If checkFile and checkInteropBuilderFile up-to-date, then nothing to do if (fileTime.CheckFileUpToDate(checkFile)) { Log("Nothing to do. SharpDX patch was already applied for assembly [{0}]", file); return(false); } // Copy PDB from input assembly to output assembly if any var readerParameters = new ReaderParameters(); var resolver = new DefaultAssemblyResolver(); readerParameters.AssemblyResolver = resolver; var writerParameters = new WriterParameters(); var pdbName = Path.ChangeExtension(file, "pdb"); if (File.Exists(pdbName)) { var symbolReaderProvider = new PdbReaderProvider(); readerParameters.SymbolReaderProvider = symbolReaderProvider; readerParameters.ReadSymbols = true; writerParameters.WriteSymbols = true; } // Read Assembly assembly = AssemblyDefinition.ReadAssembly(file, readerParameters); resolver.AddSearchDirectory(Path.GetDirectoryName(file)); // Query the target framework in order to resolve correct assemblies and type forwarding var targetFrameworkAttr = assembly.CustomAttributes.FirstOrDefault( attribute => attribute.Constructor.FullName.Contains("System.Runtime.Versioning.TargetFrameworkAttribute")); if (targetFrameworkAttr != null && targetFrameworkAttr.ConstructorArguments.Count > 0 && targetFrameworkAttr.ConstructorArguments[0].Value != null) { var targetFramework = new FrameworkName(targetFrameworkAttr.ConstructorArguments[0].Value.ToString()); var netcoreAssemblyPath = string.Format(@"Reference Assemblies\Microsoft\Framework\{0}\v{1}", targetFramework.Identifier, targetFramework.Version); netcoreAssemblyPath = Path.Combine(ProgramFilesx86(), netcoreAssemblyPath); if (Directory.Exists(netcoreAssemblyPath)) { resolver.AddSearchDirectory(netcoreAssemblyPath); } } // Import void* and int32 voidType = assembly.MainModule.TypeSystem.Void.Resolve(); voidPointerType = new PointerType(assembly.MainModule.Import(voidType)); intType = assembly.MainModule.Import(assembly.MainModule.TypeSystem.Int32.Resolve()); // Remove CompilationRelaxationsAttribute for (int i = 0; i < assembly.CustomAttributes.Count; i++) { var customAttribute = assembly.CustomAttributes[i]; if (customAttribute.AttributeType.FullName == typeof(CompilationRelaxationsAttribute).FullName) { assembly.CustomAttributes.RemoveAt(i); i--; } } Log("SharpDX interop patch for assembly [{0}]", file); foreach (var type in assembly.MainModule.Types) { PatchType(type); } // Remove All Interop classes foreach (var type in classToRemoveList) { assembly.MainModule.Types.Remove(type); } var outputFilePath = file; assembly.Write(outputFilePath, writerParameters); fileTime = new FileTime(file); // Update Check file fileTime.UpdateCheckFile(checkFile); //fileTimeInteropBuilder.UpdateCheckFile(checkInteropBuilderFile); Log("SharpDX patch done for assembly [{0}]", file); return(true); }
/// <summary> /// Patches the file. /// </summary> /// <param name="file">The file.</param> public bool PatchFile(string file) { var fileTime = new FileTime(file); //var fileTimeInteropBuilder = new FileTime(Assembly.GetExecutingAssembly().Location); string checkFile = Path.GetFullPath(file) + ".check"; //string checkInteropBuilderFile = "InteropBuild.check"; // If checkFile and checkInteropBuilderFile up-to-date, then nothing to do if (fileTime.CheckFileUpToDate(checkFile)) { Log("Nothing to do. SharpDX patch was already applied for assembly [{0}]", file); return false; } // Copy PDB from input assembly to output assembly if any var readerParameters = new ReaderParameters(); var writerParameters = new WriterParameters(); var pdbName = Path.ChangeExtension(file, "pdb"); if (File.Exists(pdbName)) { var symbolReaderProvider = new PdbReaderProvider(); readerParameters.SymbolReaderProvider = symbolReaderProvider; readerParameters.ReadSymbols = true; writerParameters.WriteSymbols = true; } // Read Assembly assembly = AssemblyDefinition.ReadAssembly(file, readerParameters); ((BaseAssemblyResolver)assembly.MainModule.AssemblyResolver).AddSearchDirectory(Path.GetDirectoryName(file)); foreach (var assemblyNameReference in assembly.MainModule.AssemblyReferences) { if (assemblyNameReference.Name.ToLower() == "mscorlib") { mscorlibAssembly = assembly.MainModule.AssemblyResolver.Resolve(assemblyNameReference); break; } } // TODO: Temporary patch to handle correctly 4.5 Core profile if (mscorlibAssembly == null) { foreach (var assemblyNameReference in assembly.MainModule.AssemblyReferences) { if (assemblyNameReference.Name == "System.Runtime") { ((BaseAssemblyResolver)assembly.MainModule.AssemblyResolver).AddSearchDirectory( Path.Combine(ProgramFilesx86(),@"Reference Assemblies\Microsoft\Framework\.NETCore\v4.5")); mscorlibAssembly = assembly.MainModule.AssemblyResolver.Resolve(assemblyNameReference); break; } } } if (mscorlibAssembly == null) { LogError("Missing mscorlib.dll from assembly {0}", file); throw new InvalidOperationException("Missing mscorlib.dll from assembly"); } // Import void* and int32 from assembly using mscorlib specific version (2.0 or 4.0 depending on assembly) voidType = mscorlibAssembly.MainModule.GetType("System.Void"); voidPointerType = new PointerType(assembly.MainModule.Import(voidType)); intType = assembly.MainModule.Import( mscorlibAssembly.MainModule.GetType("System.Int32")); // Remove CompilationRelaxationsAttribute for (int i = 0; i < assembly.CustomAttributes.Count; i++) { var customAttribute = assembly.CustomAttributes[i]; if (customAttribute.AttributeType.FullName == typeof(CompilationRelaxationsAttribute).FullName) { assembly.CustomAttributes.RemoveAt(i); i--; } } Log("SharpDX interop patch for assembly [{0}]", file); foreach (var type in assembly.MainModule.Types) PatchType(type); // Remove All Interop classes foreach (var type in classToRemoveList) assembly.MainModule.Types.Remove(type); var outputFilePath = file; assembly.Write(outputFilePath, writerParameters); fileTime = new FileTime(file); // Update Check file fileTime.UpdateCheckFile(checkFile); //fileTimeInteropBuilder.UpdateCheckFile(checkInteropBuilderFile); Log("SharpDX patch done for assembly [{0}]", file); return true; }
/// <summary> /// Patches the file. /// </summary> /// <param name="file">The file.</param> public bool PatchFile(string file) { file = Path.Combine(Environment.CurrentDirectory, file); var fileTime = new FileTime(file); //var fileTimeInteropBuilder = new FileTime(Assembly.GetExecutingAssembly().Location); string checkFile = Path.GetFullPath(file) + ".check"; //string checkInteropBuilderFile = "InteropBuild.check"; // If checkFile and checkInteropBuilderFile up-to-date, then nothing to do if (fileTime.CheckFileUpToDate(checkFile)) { Log("Nothing to do. SharpDX patch was already applied for assembly [{0}]", file); return false; } // Copy PDB from input assembly to output assembly if any var readerParameters = new ReaderParameters(); var resolver = new DefaultAssemblyResolver(); readerParameters.AssemblyResolver = resolver; var writerParameters = new WriterParameters(); var pdbName = Path.ChangeExtension(file, "pdb"); if (File.Exists(pdbName)) { var symbolReaderProvider = new PdbReaderProvider(); readerParameters.SymbolReaderProvider = symbolReaderProvider; readerParameters.ReadSymbols = true; writerParameters.WriteSymbols = true; } // Read Assembly assembly = AssemblyDefinition.ReadAssembly(file, readerParameters); resolver.AddSearchDirectory(Path.GetDirectoryName(file)); // Query the target framework in order to resolve correct assemblies and type forwarding var targetFrameworkAttr = assembly.CustomAttributes.FirstOrDefault( attribute => attribute.Constructor.FullName.Contains("System.Runtime.Versioning.TargetFrameworkAttribute")); if(targetFrameworkAttr != null && targetFrameworkAttr.ConstructorArguments.Count > 0 && targetFrameworkAttr.ConstructorArguments[0].Value != null) { var targetFramework = new FrameworkName(targetFrameworkAttr.ConstructorArguments[0].Value.ToString()); var netcoreAssemblyPath = string.Format(@"Reference Assemblies\Microsoft\Framework\{0}\v{1}", targetFramework.Identifier, targetFramework.Version); netcoreAssemblyPath = Path.Combine(ProgramFilesx86(), netcoreAssemblyPath); if(Directory.Exists(netcoreAssemblyPath)) { resolver.AddSearchDirectory(netcoreAssemblyPath); } } // Import void* and int32 voidType = assembly.MainModule.TypeSystem.Void.Resolve(); voidPointerType = new PointerType(assembly.MainModule.Import(voidType)); intType = assembly.MainModule.Import( assembly.MainModule.TypeSystem.Int32.Resolve()); // Remove CompilationRelaxationsAttribute for (int i = 0; i < assembly.CustomAttributes.Count; i++) { var customAttribute = assembly.CustomAttributes[i]; if (customAttribute.AttributeType.FullName == typeof(CompilationRelaxationsAttribute).FullName) { assembly.CustomAttributes.RemoveAt(i); i--; } } Log("SharpDX interop patch for assembly [{0}]", file); foreach (var type in assembly.MainModule.Types) PatchType(type); // Remove All Interop classes foreach (var type in classToRemoveList) assembly.MainModule.Types.Remove(type); var outputFilePath = file; assembly.Write(outputFilePath, writerParameters); fileTime = new FileTime(file); // Update Check file fileTime.UpdateCheckFile(checkFile); //fileTimeInteropBuilder.UpdateCheckFile(checkInteropBuilderFile); Log("SharpDX patch done for assembly [{0}]", file); return true; }
/// <summary> /// Patches the file. /// </summary> /// <param name="TargetFile">The file.</param> public Boolean PatchFile(String TargetFile) { TargetFile = Path.Combine(Environment.CurrentDirectory, TargetFile); FileTime FileTime = new FileTime(TargetFile); // var FileTimeInteropBuilder = new FileTime(Assembly.GetExecutingAssembly().Location); String CheckFile = Path.GetFullPath(TargetFile) + ".check"; // String checkInteropBuilderFile = "InteropBuild.check"; // If checkFile and checkInteropBuilderFile up-to-date, then nothing to do if (FileTime.CheckFileUpToDate(CheckFile)) { Log("Nothing to do. SharpDX patch was already applied for assembly [{0}]", TargetFile); return false; } // Copy PDB from input assembly to output assembly if any ReaderParameters ReaderParameters = new ReaderParameters(); DefaultAssemblyResolver Resolver = new DefaultAssemblyResolver(); ReaderParameters.AssemblyResolver = Resolver; WriterParameters WriterParameters = new WriterParameters(); String PdbName = Path.ChangeExtension(TargetFile, "pdb"); if (File.Exists(PdbName)) { PdbReaderProvider SymbolReaderProvider = new PdbReaderProvider(); ReaderParameters.SymbolReaderProvider = SymbolReaderProvider; ReaderParameters.ReadSymbols = true; WriterParameters.WriteSymbols = true; } // Read Assembly Assembly = AssemblyDefinition.ReadAssembly(TargetFile, ReaderParameters); Resolver.AddSearchDirectory(Path.GetDirectoryName(TargetFile)); // Query the target framework in order to resolve correct assemblies and type forwarding CustomAttribute TargetFrameworkAttr = Assembly.CustomAttributes.FirstOrDefault( X => X.Constructor.FullName.Contains("System.Runtime.Versioning.TargetFrameworkAttribute")); if (TargetFrameworkAttr != null && TargetFrameworkAttr.ConstructorArguments.Count > 0 && TargetFrameworkAttr.ConstructorArguments[0].Value != null) { FrameworkName TargetFramework = new FrameworkName(TargetFrameworkAttr.ConstructorArguments[0].Value.ToString()); String NetcoreAssemblyPath = String.Format(@"Reference Assemblies\Microsoft\Framework\{0}\v{1}", TargetFramework.Identifier, TargetFramework.Version); NetcoreAssemblyPath = Path.Combine(ProgramFilesx86(), NetcoreAssemblyPath); if (Directory.Exists(NetcoreAssemblyPath)) { Resolver.AddSearchDirectory(NetcoreAssemblyPath); } } // Import void* and int32 VoidType = Assembly.MainModule.TypeSystem.Void.Resolve(); VoidPointerType = new PointerType(Assembly.MainModule.Import(VoidType)); IntType = Assembly.MainModule.Import(Assembly.MainModule.TypeSystem.Int32.Resolve()); // Remove CompilationRelaxationsAttribute for (Int32 Index = 0; Index < Assembly.CustomAttributes.Count; Index++) { CustomAttribute CustomAttribute = Assembly.CustomAttributes[Index]; if (CustomAttribute.AttributeType.FullName == typeof(CompilationRelaxationsAttribute).FullName) { Assembly.CustomAttributes.RemoveAt(Index); Index--; } } Log("SharpDX interop patch for assembly [{0}]", TargetFile); foreach (TypeDefinition Type in Assembly.MainModule.Types) PatchType(Type); // Remove All Interop classes foreach (TypeDefinition Type in ClassToRemoveList) Assembly.MainModule.Types.Remove(Type); String OutputFilePath = TargetFile; Assembly.Write(OutputFilePath, WriterParameters); FileTime = new FileTime(TargetFile); // Update Check file FileTime.UpdateCheckFile(CheckFile); // FileTimeInteropBuilder.UpdateCheckFile(CheckInteropBuilderFile); Log("SharpDX patch done for assembly [{0}]", TargetFile); return true; }