/// <summary> /// Adds a default constructor to the target type. /// </summary> /// <param name="targetType">The type that will contain the default constructor.</param> /// <returns>The default constructor.</returns> public static MethodDefinition AddDefaultConstructor(this TypeDefinition targetType, IPapyrusCilAssemblyBuilder libraryGenerator) { var parentType = typeof(object); return(AddDefaultConstructor(targetType, parentType, libraryGenerator)); }
/// <summary> /// Adds a default constructor to the target type. /// </summary> /// <param name="parentType"> /// The base class that contains the default constructor that will be used for constructor /// chaining.. /// </param> /// <param name="targetType">The type that will contain the default constructor.</param> /// <returns>The default constructor.</returns> public static MethodDefinition AddDefaultConstructor(this TypeDefinition targetType, Type parentType, IPapyrusCilAssemblyBuilder libraryGenerator) { var module = libraryGenerator.MainModule; // targetType.Module; var voidType = module.Import(typeof(void)); var methodAttributes = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName; var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; var objectConstructor = parentType.GetConstructor(flags, null, new Type[0], null); // Revert to the System.Object constructor // if the parent type does not have a default constructor if (objectConstructor == null) { objectConstructor = typeof(object).GetConstructor(new Type[0]); } var baseConstructor = module.Import(objectConstructor); // Define the default constructor var ctor = new MethodDefinition(".ctor", methodAttributes, voidType) { CallingConvention = MethodCallingConvention.StdCall, ImplAttributes = MethodImplAttributes.IL | MethodImplAttributes.Managed }; var IL = ctor.Body.Instructions; // Call the constructor for System.Object, and exit IL.Add(Instruction.Create(OpCodes.Ldarg_0)); IL.Add(Instruction.Create(OpCodes.Call, baseConstructor)); IL.Add(Instruction.Create(OpCodes.Ret)); targetType.Methods.Add(ctor); return(ctor); }
public void Initialize(IPapyrusCilAssemblyBuilder builder) { this.builder = builder; }
private static void Main(string[] args) { Console.Title = "PapyrusDotNet"; var inputDirectory = @"C:\CreationKit\Data\Scripts\Source"; var inputExtensionFilter = "*.pas"; var inputSourceType = "assembly"; var parsed = new PapyrusDotNetArgs { InputFolder = inputDirectory, InputType = "script" }; try { // TODO: set the parsed = null; as default value. if (parsed == null) { parsed = Args.Parse <PapyrusDotNetArgs>(args); } if (parsed.InputFolder != null) { // Console.WriteLine("You entered string '{0}' and int '{1}'", parsed.StringArg, parsed.IntArg); if (parsed.InputType.ToLower().Contains("script") || parsed.InputType.ToLower().Contains("psc")) { inputExtensionFilter = "*.psc"; inputSourceType = "script"; } inputDirectory = parsed.InputFolder; if (inputDirectory.Contains("\"")) { inputDirectory = inputDirectory.Replace("\"", ""); } // Console.WriteLine("You entered string '{0}' and int '{1}'", parsed.InputFile, parsed.OutputFolder); } if (parsed.InputFolder == null) { Console.WriteLine("No arguments were defined, using default."); Console.WriteLine("Input: " + inputDirectory); Console.WriteLine("Type: " + inputSourceType); Console.WriteLine(); Console.WriteLine("If you are fine with this, press any key to continue."); Console.WriteLine("Or hit CTRL+C to exit."); Console.ReadKey(); } } catch (ArgException ex) { Console.WriteLine("Crash on startup :("); Console.WriteLine("Exception thrown: " + ex); return; } var inputSourceFiles = Directory.GetFiles(inputDirectory, inputExtensionFilter, SearchOption.AllDirectories); coreAssemblyBuilder = new PapyrusCilAssemblyBuilder(); coreAssemblyBuilder.BuildAssembly(inputSourceFiles); Console.ReadKey(); }