Browse Source

Support for execing main assembly

Josh Engebretson 10 years ago
parent
commit
702211023b

+ 36 - 1
Script/AtomicNET/AtomicNET/AtomicNETEngine/AtomicNET.cs

@@ -1,4 +1,5 @@
 using System;
 using System;
+using System.Reflection;
 using System.Runtime.InteropServices;
 using System.Runtime.InteropServices;
 using System.Collections.Generic;
 using System.Collections.Generic;
 
 
@@ -29,7 +30,41 @@ public static class Atomic
     UIModule.Initialize ();
     UIModule.Initialize ();
     AtomicNETModule.Initialize();
     AtomicNETModule.Initialize();
     AtomicPlayer.PlayerModule.Initialize ();
     AtomicPlayer.PlayerModule.Initialize ();
-    //initSubsystems();
+  }
+
+  static public void Start()
+  {
+    initSubsystems();
+  }
+
+  static public void ExecMainAssembly()
+  {
+      Assembly assembly = null;
+
+      try
+      {
+        assembly = Assembly.Load("Main");
+      }
+      catch (Exception e)
+      {
+          Console.WriteLine("Failed to exec main assembly {0}", e.Message );
+          return;
+      }
+
+      if (assembly == null)
+        return;
+
+      // a project assembly may define an AtomicMain which will be run
+      foreach (var type in assembly.GetTypes())
+      {
+        MethodInfo main = type.GetMethod("Main", BindingFlags.Public | BindingFlags.Static);
+
+        if (main == null || main.GetParameters().Length != 0)
+          continue;
+
+        main.Invoke(null, null);
+
+      }
   }
   }
 
 
   static Dictionary<Type, RefCounted> subSystems = new Dictionary<Type, RefCounted>();
   static Dictionary<Type, RefCounted> subSystems = new Dictionary<Type, RefCounted>();

+ 11 - 3
Script/AtomicNET/AtomicNET/AtomicNETEngine/Math.cs

@@ -55,7 +55,7 @@ namespace AtomicEngine
 			this.x = x;
 			this.x = x;
 			this.y = y;
 			this.y = y;
 		}
 		}
-			
+
 		public float x;
 		public float x;
 		public float y;
 		public float y;
 
 
@@ -81,7 +81,7 @@ namespace AtomicEngine
 		public float x;
 		public float x;
 		public float y;
 		public float y;
 		public float z;
 		public float z;
-			
+
 		static public readonly Quaternion Identity = new Quaternion();
 		static public readonly Quaternion Identity = new Quaternion();
 
 
 	}
 	}
@@ -107,6 +107,15 @@ namespace AtomicEngine
 	[StructLayout (LayoutKind.Sequential, CharSet = CharSet.Ansi)]
 	[StructLayout (LayoutKind.Sequential, CharSet = CharSet.Ansi)]
 	public struct IntRect
 	public struct IntRect
 	{
 	{
+		/// Left coordinate.
+    int left;
+    /// Top coordinate.
+    int top;
+    /// Right coordinate.
+    int right;
+    /// Bottom coordinate.
+    int bottom;
+
 	}
 	}
 
 
 	[StructLayout (LayoutKind.Sequential, CharSet = CharSet.Ansi)]
 	[StructLayout (LayoutKind.Sequential, CharSet = CharSet.Ansi)]
@@ -135,4 +144,3 @@ namespace AtomicEngine
 	public struct Rect
 	public struct Rect
 	{
 	{
 	}}
 	}}
-

+ 2 - 0
Script/AtomicNET/AtomicNET/AtomicNETTools/AssemblyInspector.cs

@@ -71,6 +71,7 @@ namespace AtomicTools
 		{
 		{
 
 
 			foreach (var handle in metaReader.TypeDefinitions) {
 			foreach (var handle in metaReader.TypeDefinitions) {
+
 				var typeDef = metaReader.GetTypeDefinition (handle);
 				var typeDef = metaReader.GetTypeDefinition (handle);
 
 
 				var baseTypeHandle = typeDef.BaseType;
 				var baseTypeHandle = typeDef.BaseType;
@@ -96,6 +97,7 @@ namespace AtomicTools
 		void ParseEnums ()
 		void ParseEnums ()
 		{
 		{
 			foreach (var handle in metaReader.TypeDefinitions) {
 			foreach (var handle in metaReader.TypeDefinitions) {
+
 				var typeDef = metaReader.GetTypeDefinition (handle);
 				var typeDef = metaReader.GetTypeDefinition (handle);
 
 
 				var baseTypeHandle = typeDef.BaseType;
 				var baseTypeHandle = typeDef.BaseType;

+ 9 - 2
Source/AtomicEditor/Application/AEPlayerApp.cpp

@@ -116,8 +116,8 @@ void AEPlayerApplication::Setup()
 
 
 #ifdef ATOMIC_DEV_BUILD
 #ifdef ATOMIC_DEV_BUILD
 
 
-                String resourcePaths = ToString("%s/Resources/CoreData;%s/Resources/PlayerData;%s/;%s/Resources;%s;%sCache",
-                         ATOMIC_ROOT_SOURCE_DIR, ATOMIC_ROOT_SOURCE_DIR, value.CString(), value.CString(), value.CString(), value.CString());
+                String resourcePaths = ToString("%s/Resources/CoreData;%s/Resources/PlayerData;%sResources;%s;%sCache",
+                         ATOMIC_ROOT_SOURCE_DIR, ATOMIC_ROOT_SOURCE_DIR, value.CString(), value.CString(), value.CString());
 
 
 #else
 #else
 
 
@@ -188,6 +188,13 @@ void AEPlayerApplication::Start()
         }
         }
 
 
     }
     }
+
+#ifdef ATOMIC_DOTNET
+    NETCore* netCore = GetSubsystem<NETCore>();
+    if (netCore)
+        netCore->Start();
+#endif
+
     return;
     return;
 }
 }
 
 

+ 45 - 1
Source/AtomicNET/NETCore/NETCore.cpp

@@ -1,8 +1,9 @@
 
 
+#include <Atomic/Core/StringUtils.h>
 #include <Atomic/Core/CoreEvents.h>
 #include <Atomic/Core/CoreEvents.h>
 #include <Atomic/IO/FileSystem.h>
 #include <Atomic/IO/FileSystem.h>
 #include <Atomic/IO/Log.h>
 #include <Atomic/IO/Log.h>
-#include <Atomic/Core/StringUtils.h>
+#include <Atomic/Resource/ResourceCache.h>
 
 
 #include "CSEventHelper.h"
 #include "CSEventHelper.h"
 #include "CSComponent.h"
 #include "CSComponent.h"
@@ -124,6 +125,49 @@ bool NETCore::CreateDelegate(const String& assemblyName, const String& qualified
     return netHost_->CreateDelegate(assemblyName, qualifiedClassName, methodName, funcOut);
     return netHost_->CreateDelegate(assemblyName, qualifiedClassName, methodName, funcOut);
 }
 }
 
 
+bool NETCore::Start()
+{
+    if (context_->GetEditorContext())
+        return true;
+
+    typedef void (*StartFunction)();
+    StartFunction start;
+
+    bool result = netHost_->CreateDelegate(
+                    "AtomicNETEngine",
+                    "AtomicEngine.Atomic",
+                    "Start",
+                    (void**) &start);
+
+    if (!result)
+        return false;
+
+    if (result)
+    {
+        start();
+
+        // Load Project Assemblies
+
+        typedef void (*ExecMainAssemblyFunction)();
+        ExecMainAssemblyFunction execMainAssembly;
+
+        result = netHost_->CreateDelegate(
+                        "AtomicNETEngine",
+                        "AtomicEngine.Atomic",
+                        "ExecMainAssembly",
+                        (void**) &execMainAssembly);
+
+        if (!result)
+            return false;
+
+        execMainAssembly();
+
+    }
+
+    return true;
+
+}
+
 bool NETCore::Initialize(String& errorMsg)
 bool NETCore::Initialize(String& errorMsg)
 {
 {
 
 

+ 1 - 0
Source/AtomicNET/NETCore/NETCore.h

@@ -42,6 +42,7 @@ public:
     virtual ~NETCore();
     virtual ~NETCore();
 
 
     bool Initialize(String &errorMsg);
     bool Initialize(String &errorMsg);
+    bool Start();
     void Shutdown();
     void Shutdown();
 
 
     void AddAssemblyLoadPath(const String& assemblyPath);
     void AddAssemblyLoadPath(const String& assemblyPath);