示例#1
0
        public int Generate(List <string> args)
        {
            Console.WriteLine("Parsing assemblies...");

            var universe   = new Universe(UniverseOptions.MetadataOnly);
            var assemblies = new List <Assembly> ();

            foreach (var arg in args)
            {
                assemblies.Add(universe.LoadFile(arg));
                Console.WriteLine($"\tParsed '{arg}'");
            }

            // if not specified then we use the first specified assembly name
            if (LibraryName == null)
            {
                LibraryName = Path.GetFileNameWithoutExtension(args [0]);
            }

            Console.WriteLine("Processing assemblies...");
            var g = new ObjCGenerator();

            g.Process(assemblies);

            Console.WriteLine("Generating binding code...");
            g.Generate(assemblies);
            g.Write(OutputDirectory);

            var exe = typeof(Driver).Assembly;

            foreach (var res in exe.GetManifestResourceNames())
            {
                if (res == "main.c")
                {
                    // no main is needed for dylib and don't re-write an existing main.c file - it's a template
                    if (CompilationTarget != CompilationTarget.StaticLibrary || File.Exists("main.c"))
                    {
                        continue;
                    }
                }
                var path = Path.Combine(OutputDirectory, res);
                Console.WriteLine($"\tGenerated: {path}");
                using (var sw = new StreamWriter(path))
                    exe.GetManifestResourceStream(res).CopyTo(sw.BaseStream);
            }
            return(0);
        }
示例#2
0
        public int Generate(List <string> args)
        {
            Console.WriteLine("Parsing assemblies...");

            var universe = new Universe(UniverseOptions.MetadataOnly);

            universe.AssemblyResolve += (object sender, IKVM.Reflection.ResolveEventArgs resolve_args) => {
                var directories = new List <string> ();
                directories.Add(PlatformSdkDirectory);
                directories.Add(Path.Combine(PlatformSdkDirectory, "Facades"));
                foreach (var asm in Assemblies)
                {
                    directories.Add(Path.GetDirectoryName(asm.Location));
                }

                AssemblyName an = new AssemblyName(resolve_args.Name);
                foreach (var dir in directories)
                {
                    var filename = Path.Combine(dir, an.Name + ".dll");
                    if (File.Exists(filename))
                    {
                        return(universe.LoadFile(filename));
                    }
                }
                throw ErrorHelper.CreateError(13, $"Can't find the assembly '{resolve_args.Name}', referenced by '{resolve_args.RequestingAssembly.FullName}'.");
            };

            foreach (var arg in args)
            {
                if (!File.Exists(arg))
                {
                    throw ErrorHelper.CreateError(11, $"The assembly {arg} does not exist.");
                }

                Assemblies.Add(universe.LoadFile(arg));
                Console.WriteLine($"\tParsed '{arg}'");
            }

            // if not specified then we use the first specified assembly name
            if (LibraryName == null)
            {
                LibraryName = Path.GetFileNameWithoutExtension(args [0]);
            }

            Console.WriteLine("Processing assemblies...");
            var g = new ObjCGenerator();

            g.Process(Assemblies);

            Console.WriteLine("Generating binding code...");
            g.Generate();
            g.Write(OutputDirectory);

            var exe = typeof(Driver).Assembly;

            foreach (var res in exe.GetManifestResourceNames())
            {
                if (res == "main.c")
                {
                    // no main is needed for dylib and don't re-write an existing main.c file - it's a template
                    if (CompilationTarget != CompilationTarget.StaticLibrary || File.Exists("main.c"))
                    {
                        continue;
                    }
                }
                var path = Path.Combine(OutputDirectory, res);
                Console.WriteLine($"\tGenerated: {path}");
                using (var sw = new StreamWriter(path))
                    exe.GetManifestResourceStream(res).CopyTo(sw.BaseStream);
            }
            return(0);
        }