Browse Source

Various changes that were needed to get scripting to actually work

Marko Pintera 12 years ago
parent
commit
db1db0a4a2

+ 1 - 0
BansheeEngine/Include/BsEngineAssembly.h

@@ -17,6 +17,7 @@ namespace BansheeEngine
 	private:
 		static const CM::String ENGINE_ASSEMBLY_PATH;
 		static const CM::String ENGINE_ASSEMBLY_NAME;
+		static const CM::String ASSEMBLY_ENTRY_POINT;
 
 		ScriptAssembly* mAssembly;
 	};

+ 7 - 2
BansheeEngine/Include/BsScriptAssembly.h

@@ -30,15 +30,20 @@ namespace BansheeEngine
 		~ScriptAssembly();
 
 		ScriptClass& getClass(const CM::String& namespaceName, const CM::String& name);
+		MonoDomain* getDomain() const { return mDomain; }
 
 	private:
 		friend class ScriptManager;
 
-		ScriptAssembly(MonoAssembly* assembly);
+		ScriptAssembly();
 
-		void load(MonoAssembly* assembly);
+		void load(const CM::String& path, const CM::String& name);
 		void unload();
 
+		void initialize(const CM::String& entryPoint);
+
+		CM::String mName;
+		MonoDomain* mDomain;
 		MonoImage* mMonoImage;
 		MonoAssembly* mMonoAssembly;
 		bool mIsLoaded;

+ 2 - 1
BansheeEngine/Include/BsScriptClass.h

@@ -39,8 +39,9 @@ namespace BansheeEngine
 	private:
 		friend class ScriptAssembly;
 
-		ScriptClass(const CM::String& fullName, MonoClass* monoClass);
+		ScriptClass(const CM::String& fullName, MonoClass* monoClass, ScriptAssembly* parentAssembly);
 
+		ScriptAssembly* mParentAssembly;
 		MonoClass* mClass;
 		CM::String mFullName;
 

+ 1 - 5
BansheeEngine/Include/BsScriptManager.h

@@ -16,14 +16,11 @@ namespace BansheeEngine
 		ScriptManager();
 		~ScriptManager();
 
-		ScriptAssembly& loadAssembly(const CM::String& path, const CM::String& name);
+		ScriptAssembly& loadAssembly(const CM::String& path, const CM::String& name, const CM::String& entryPoint = CM::StringUtil::BLANK);
 		void unloadAssembly(ScriptAssembly& assembly);
 
-		MonoDomain* getDomain() const { return mDomain; }
-
 		static void registerScriptType(ScriptMeta* metaData);
 	private:
-		static const CM::String DOMAIN_NAME;
 		static const CM::String MONO_LIB_DIR;
 		static const CM::String MONO_ETC_DIR;
 
@@ -33,7 +30,6 @@ namespace BansheeEngine
 			return mTypesToInitialize;
 		}
 
-		MonoDomain* mDomain;
 		CM::UnorderedMap<CM::String, ScriptAssembly*>::type mAssemblies;
 	};
 }

+ 2 - 1
BansheeEngine/Source/BsEngineAssembly.cpp

@@ -7,10 +7,11 @@ namespace BansheeEngine
 {
 	const CM::String EngineAssembly::ENGINE_ASSEMBLY_PATH = "..\\..\\Assemblies\\MBansheeEngine.dll";
 	const CM::String EngineAssembly::ENGINE_ASSEMBLY_NAME = "MBansheeEngine";
+	const CM::String EngineAssembly::ASSEMBLY_ENTRY_POINT = "Program::Main";
 
 	EngineAssembly::EngineAssembly()
 	{
-		mAssembly = &ScriptManager::instance().loadAssembly(ENGINE_ASSEMBLY_PATH, ENGINE_ASSEMBLY_NAME);
+		mAssembly = &ScriptManager::instance().loadAssembly(ENGINE_ASSEMBLY_PATH, ENGINE_ASSEMBLY_NAME, ASSEMBLY_ENTRY_POINT);
 	}
 
 	EngineAssembly::~EngineAssembly()

+ 51 - 11
BansheeEngine/Source/BsScriptAssembly.cpp

@@ -1,8 +1,11 @@
 #include "BsScriptAssembly.h"
 #include "BsScriptClass.h"
+#include "BsScriptManager.h"
 #include "CmUtil.h"
 #include "CmException.h"
 
+#include <mono/metadata/debug-helpers.h>
+
 using namespace CamelotFramework;
 
 namespace BansheeEngine
@@ -15,7 +18,7 @@ namespace BansheeEngine
 		return seed;
 	}
 
-	inline bool ScriptAssembly::ClassId::Equals::operator()(const ScriptAssembly::ClassId &a, const ScriptAssembly::ClassId &b) const
+	inline bool ScriptAssembly::ClassId::Equals::operator()(const ScriptAssembly::ClassId& a, const ScriptAssembly::ClassId& b) const
 	{
 		return a.name == b.name && a.namespaceName == b.namespaceName;
 	}
@@ -26,22 +29,42 @@ namespace BansheeEngine
 
 	}
 
-	ScriptAssembly::ScriptAssembly(MonoAssembly* assembly)
+	ScriptAssembly::ScriptAssembly()
+		:mIsLoaded(false), mMonoImage(nullptr), mMonoAssembly(nullptr), mDomain(nullptr)
 	{
-		load(assembly);
+
 	}
 
 	ScriptAssembly::~ScriptAssembly()
 	{
-		for(auto& entry : mClasses)
-			cm_delete(entry.second);
+		unload();
 
-		mClasses.clear();
+		if(mDomain != nullptr)
+		{
+			mono_jit_cleanup(mDomain);
+			mDomain = nullptr;
+		}
 	}
 
-	void ScriptAssembly::load(MonoAssembly* assembly)
+	void ScriptAssembly::load(const CM::String& path, const CM::String& name)
 	{
-		mMonoAssembly = assembly;
+		if(mDomain == nullptr)
+		{
+			mDomain = mono_jit_init (path.c_str());
+			if(mDomain == nullptr)
+			{
+				CM_EXCEPT(InternalErrorException, "Cannot initialize Mono runtime.");
+			}
+		}
+
+		MonoAssembly* monoAssembly = mono_domain_assembly_open (mDomain, path.c_str());
+		if(monoAssembly == nullptr)
+		{
+			CM_EXCEPT(InvalidParametersException, "Cannot load Mono assembly: " + path);
+		}
+
+		mName = name;
+		mMonoAssembly = monoAssembly;
 		mMonoImage = mono_assembly_get_image(mMonoAssembly);
 		if(mMonoImage == nullptr)
 		{
@@ -53,7 +76,15 @@ namespace BansheeEngine
 
 	void ScriptAssembly::unload()
 	{
-		if(mMonoImage)
+		if(!mIsLoaded)
+			return;
+
+		for(auto& entry : mClasses)
+			cm_delete(entry.second);
+
+		mClasses.clear();
+
+		if(mMonoImage != nullptr)
 		{
 			mono_image_close(mMonoImage);
 			mMonoImage = nullptr;
@@ -63,6 +94,15 @@ namespace BansheeEngine
 		mMonoAssembly = nullptr;
 	}
 
+	void ScriptAssembly::initialize(const CM::String& entryPoint)
+	{
+		MonoMethodDesc* methodDesc = mono_method_desc_new(entryPoint.c_str(), false);
+		MonoMethod* entry = mono_method_desc_search_in_image(methodDesc, mMonoImage);
+
+		if(entry != nullptr)
+			mono_runtime_invoke(entry, nullptr, nullptr, nullptr);
+	}
+
 	ScriptClass& ScriptAssembly::getClass(const String& namespaceName, const String& name)
 	{
 		if(!mIsLoaded)
@@ -80,8 +120,8 @@ namespace BansheeEngine
 			CM_EXCEPT(InvalidParametersException, "Cannot get Mono class: " + namespaceName + "." + name);
 		}
 
-		String fullClassName = namespaceName + "::" + name;
-		ScriptClass* newClass = new (cm_alloc<ScriptClass>()) ScriptClass(fullClassName, monoClass);
+		String fullClassName = namespaceName + "." + name;
+		ScriptClass* newClass = new (cm_alloc<ScriptClass>()) ScriptClass(fullClassName, monoClass, this);
 		mClasses[classId] = newClass;
 
 		return *newClass;

+ 11 - 3
BansheeEngine/Source/BsScriptClass.cpp

@@ -2,6 +2,7 @@
 #include "BsScriptMethod.h"
 #include "BsScriptField.h"
 #include "BsScriptProperty.h"
+#include "BsScriptAssembly.h"
 #include "BsScriptManager.h"
 #include "CmUtil.h"
 #include "CmException.h"
@@ -29,8 +30,8 @@ namespace BansheeEngine
 
 	}
 
-	ScriptClass::ScriptClass(const String& fullName, MonoClass* monoClass)
-		:mFullName(fullName), mClass(monoClass)
+	ScriptClass::ScriptClass(const String& fullName, MonoClass* monoClass, ScriptAssembly* parentAssembly)
+		:mFullName(fullName), mClass(monoClass), mParentAssembly(parentAssembly)
 	{
 
 	}
@@ -50,6 +51,13 @@ namespace BansheeEngine
 		}
 
 		mFields.clear();
+
+		for(auto& mapEntry : mProperties)
+		{
+			cm_delete(mapEntry.second);
+		}
+
+		mProperties.clear();
 	}
 
 	ScriptMethod& ScriptClass::getMethod(const String& name, UINT32 numParams)
@@ -123,7 +131,7 @@ namespace BansheeEngine
 
 	MonoObject* ScriptClass::createInstance() const
 	{
-		MonoObject* obj = mono_object_new(ScriptManager::instance().getDomain(), mClass);
+		MonoObject* obj = mono_object_new(mParentAssembly->getDomain(), mClass);
 
 		return obj;
 	}

+ 0 - 1
BansheeEngine/Source/BsScriptGUIElementStateStyle.cpp

@@ -81,7 +81,6 @@ namespace BansheeEngine
 		}
 
 		value = nullptr;
-		return;
 	}
 
 	void ScriptGUIElementStateStyle::internal_SetTexture(ScriptGUIElementStateStyle* nativeInstance, ScriptSpriteTexture* value)

+ 20 - 37
BansheeEngine/Source/BsScriptManager.cpp

@@ -11,7 +11,6 @@ using namespace CamelotFramework;
 
 namespace BansheeEngine
 {
-	const String ScriptManager::DOMAIN_NAME = "BansheeEngine";
 	const String ScriptManager::MONO_LIB_DIR = "..\\..\\Mono\\lib";
 	const String ScriptManager::MONO_ETC_DIR = "..\\..\\Mono\\etc";
 
@@ -19,12 +18,6 @@ namespace BansheeEngine
 	{
 		mono_set_dirs(MONO_LIB_DIR.c_str(), MONO_ETC_DIR.c_str()); 
 		mono_config_parse(nullptr);
-
-		mDomain = mono_jit_init (DOMAIN_NAME.c_str());
-		if(mDomain == nullptr)
-		{
-			CM_EXCEPT(InternalErrorException, "Cannot initialize Mono runtime.");
-		}
 	}
 
 	ScriptManager::~ScriptManager()
@@ -36,47 +29,37 @@ namespace BansheeEngine
 		}
 
 		mAssemblies.clear();
-
-		if(mDomain != nullptr)
-			mono_jit_cleanup(mDomain);
 	}
 
-	ScriptAssembly& ScriptManager::loadAssembly(const String& path, const String& name)
+	ScriptAssembly& ScriptManager::loadAssembly(const String& path, const String& name, const String& entryPoint)
 	{
+		ScriptAssembly* assembly = nullptr;
+
 		auto iterFind = mAssemblies.find(name);
 		if(iterFind != mAssemblies.end())
 		{
-			ScriptAssembly* assembly = iterFind->second;
-			if(!assembly->mIsLoaded)
-			{
-				MonoAssembly* monoAssembly = mono_domain_assembly_open (mDomain, path.c_str());
-				if(monoAssembly == nullptr)
-				{
-					CM_EXCEPT(InvalidParametersException, "Cannot load Mono assembly: " + path);
-				}
-
-				assembly->load(monoAssembly);
-			}
-
-			return *iterFind->second;
+			assembly = iterFind->second;
 		}
-
-		MonoAssembly* monoAssembly = mono_domain_assembly_open (mDomain, path.c_str());
-		if(monoAssembly == nullptr)
+		else
 		{
-			CM_EXCEPT(InvalidParametersException, "Cannot load Mono assembly: " + path);
+			assembly = new (cm_alloc<ScriptAssembly>()) ScriptAssembly();
+			mAssemblies[name] = assembly;
 		}
 
-		ScriptAssembly* assembly = new (cm_alloc<ScriptAssembly>()) ScriptAssembly(monoAssembly);
-		mAssemblies[name] = assembly;
-
-		// Fully initialize all types that use this assembly
-		Vector<ScriptMeta*>::type& mTypeMetas = getTypesToInitialize()[name];
-		for(auto& meta : mTypeMetas)
+		if(!assembly->mIsLoaded)
 		{
-			meta->scriptClass = &assembly->getClass(meta->ns, meta->name);
-			meta->thisPtrField = &meta->scriptClass->getField("mCachedPtr");
-			meta->initCallback();
+			assembly->load(path, name);
+
+			// Fully initialize all types that use this assembly
+			Vector<ScriptMeta*>::type& mTypeMetas = getTypesToInitialize()[name];
+			for(auto& meta : mTypeMetas)
+			{
+				meta->scriptClass = &assembly->getClass(meta->ns, meta->name);
+				meta->thisPtrField = &meta->scriptClass->getField("mCachedPtr");
+				meta->initCallback();
+			}
+
+			assembly->initialize(entryPoint); // Perform any initialization after everything is loaded
 		}
 
 		return *assembly;

+ 2 - 2
MBansheeEngine/Font.cs

@@ -1,4 +1,4 @@
-using System.Runtime.InteropServices;
+using System.Runtime.CompilerServices;
 
 namespace BansheeEngine
 {
@@ -9,7 +9,7 @@ namespace BansheeEngine
             Internal_CreateInstance(this);
         }
 
-        [DllImport("__Internal")]
+        [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_CreateInstance(Font instance);
     }
 }

+ 6 - 6
MBansheeEngine/GUIElementStateStyle.cs

@@ -1,5 +1,5 @@
 using System;
-using System.Runtime.InteropServices;
+using System.Runtime.CompilerServices;
 
 namespace BansheeEngine
 {
@@ -22,17 +22,17 @@ namespace BansheeEngine
             set { Internal_SetTextColor(mCachedPtr, ref value); }
         }
 
-        [DllImport("__Internal")]
+        [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_CreateInstance(GUIElementStateStyle instance);
 
-        [DllImport("__Internal")]
+        [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_GetTexture(IntPtr nativeInstance, out SpriteTexture value);
-        [DllImport("__Internal")]
+        [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_SetTexture(IntPtr nativeInstance, SpriteTexture value);
 
-        [DllImport("__Internal")]
+        [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_GetTextColor(IntPtr nativeInstance, out Color value);
-        [DllImport("__Internal")]
+        [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_SetTextColor(IntPtr nativeInstance, ref Color value);
     };
 }

+ 129 - 83
MBansheeEngine/GUIElementStyle.cs

@@ -1,9 +1,5 @@
 using System;
-using System.Collections.Generic;
-using System.Linq;
 using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-using System.Text;
 
 namespace BansheeEngine
 {
@@ -190,86 +186,136 @@ namespace BansheeEngine
             set { Internal_SetFixedHeight(mCachedPtr, value); }
         }
 
-        [DllImport("__Internal")]
+        [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_CreateInstance(GUIElementStyle instance);
 
-        [DllImport("__Internal")] private static extern Font Internal_GetFont(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetFont(IntPtr nativeInstance, Font value);
-
-        [DllImport("__Internal")] private static extern int Internal_GetFontSize(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetFontSize(IntPtr nativeInstance, int value);
-
-        [DllImport("__Internal")] private static extern TextHorzAlign Internal_GetTextHorzAlign(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetTextHorzAlign(IntPtr nativeInstance, TextHorzAlign value);
-
-        [DllImport("__Internal")] private static extern TextVertAlign Internal_GetTextVertAlign(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetTextVertAlign(IntPtr nativeInstance, TextVertAlign value);
-
-        [DllImport("__Internal")] private static extern GUIImagePosition Internal_GetImagePosition(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetImagePosition(IntPtr nativeInstance, GUIImagePosition value);
-
-        [DllImport("__Internal")] private static extern bool Internal_GetWordWrap(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetWordWrap(IntPtr nativeInstance, bool value);
-
-
-        [DllImport("__Internal")] private static extern GUIElementStateStyle Internal_GetNormal(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetNormal(IntPtr nativeInstance, GUIElementStateStyle value);
-
-        [DllImport("__Internal")] private static extern GUIElementStateStyle Internal_GetHover(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetHover(IntPtr nativeInstance, GUIElementStateStyle value);
-
-        [DllImport("__Internal")] private static extern GUIElementStateStyle Internal_GetActive(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetActive(IntPtr nativeInstance, GUIElementStateStyle value);
-
-        [DllImport("__Internal")] private static extern GUIElementStateStyle Internal_GetFocused(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetFocused(IntPtr nativeInstance, GUIElementStateStyle value);
-
-
-        [DllImport("__Internal")] private static extern GUIElementStateStyle Internal_GetNormalOn(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetNormalOn(IntPtr nativeInstance, GUIElementStateStyle value);
-
-        [DllImport("__Internal")] private static extern GUIElementStateStyle Internal_GetHoverOn(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetHoverOn(IntPtr nativeInstance, GUIElementStateStyle value);
-
-        [DllImport("__Internal")] private static extern GUIElementStateStyle Internal_GetActiveOn(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetActiveOn(IntPtr nativeInstance, GUIElementStateStyle value);
-
-        [DllImport("__Internal")] private static extern GUIElementStateStyle Internal_GetFocusedOn(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetFocusedOn(IntPtr nativeInstance, GUIElementStateStyle value);
-
-
-        [DllImport("__Internal")] private static extern RectOffset Internal_GetBorder(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetBorder(IntPtr nativeInstance, RectOffset value);
-
-        [DllImport("__Internal")] private static extern RectOffset Internal_GetMargins(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetMargins(IntPtr nativeInstance, RectOffset value);
-
-        [DllImport("__Internal")] private static extern RectOffset Internal_GetContentOffset(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetContentOffset(IntPtr nativeInstance, RectOffset value);
-
-
-        [DllImport("__Internal")] private static extern int Internal_GetWidth(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetWidth(IntPtr nativeInstance, int value);
-
-        [DllImport("__Internal")] private static extern int Internal_GetHeight(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetHeight(IntPtr nativeInstance, int value);
-
-        [DllImport("__Internal")] private static extern int Internal_GetMinWidth(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetMinWidth(IntPtr nativeInstance, int value);
-
-        [DllImport("__Internal")] private static extern int Internal_GetMaxWidth(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetMaxWidth(IntPtr nativeInstance, int value);
-
-        [DllImport("__Internal")] private static extern int Internal_GetMinHeight(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetMinHeight(IntPtr nativeInstance, int value);
-
-        [DllImport("__Internal")] private static extern int Internal_GetMaxHeight(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetMaxHeight(IntPtr nativeInstance, int value);
-
-        [DllImport("__Internal")] private static extern bool Internal_GetFixedWidth(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetFixedWidth(IntPtr nativeInstance, bool value);
-
-        [DllImport("__Internal")] private static extern bool Internal_GetFixedHeight(IntPtr nativeInstance);
-        [DllImport("__Internal")] private static extern void Internal_SetFixedHeight(IntPtr nativeInstance, bool value);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern Font Internal_GetFont(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetFont(IntPtr nativeInstance, Font value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern int Internal_GetFontSize(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetFontSize(IntPtr nativeInstance, int value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern TextHorzAlign Internal_GetTextHorzAlign(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetTextHorzAlign(IntPtr nativeInstance, TextHorzAlign value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern TextVertAlign Internal_GetTextVertAlign(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetTextVertAlign(IntPtr nativeInstance, TextVertAlign value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern GUIImagePosition Internal_GetImagePosition(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetImagePosition(IntPtr nativeInstance, GUIImagePosition value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern bool Internal_GetWordWrap(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetWordWrap(IntPtr nativeInstance, bool value);
+
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern GUIElementStateStyle Internal_GetNormal(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetNormal(IntPtr nativeInstance, GUIElementStateStyle value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern GUIElementStateStyle Internal_GetHover(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetHover(IntPtr nativeInstance, GUIElementStateStyle value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern GUIElementStateStyle Internal_GetActive(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetActive(IntPtr nativeInstance, GUIElementStateStyle value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern GUIElementStateStyle Internal_GetFocused(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetFocused(IntPtr nativeInstance, GUIElementStateStyle value);
+
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern GUIElementStateStyle Internal_GetNormalOn(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetNormalOn(IntPtr nativeInstance, GUIElementStateStyle value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern GUIElementStateStyle Internal_GetHoverOn(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetHoverOn(IntPtr nativeInstance, GUIElementStateStyle value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern GUIElementStateStyle Internal_GetActiveOn(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetActiveOn(IntPtr nativeInstance, GUIElementStateStyle value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern GUIElementStateStyle Internal_GetFocusedOn(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetFocusedOn(IntPtr nativeInstance, GUIElementStateStyle value);
+
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern RectOffset Internal_GetBorder(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetBorder(IntPtr nativeInstance, RectOffset value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern RectOffset Internal_GetMargins(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetMargins(IntPtr nativeInstance, RectOffset value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern RectOffset Internal_GetContentOffset(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetContentOffset(IntPtr nativeInstance, RectOffset value);
+
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern int Internal_GetWidth(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetWidth(IntPtr nativeInstance, int value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern int Internal_GetHeight(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetHeight(IntPtr nativeInstance, int value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern int Internal_GetMinWidth(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetMinWidth(IntPtr nativeInstance, int value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern int Internal_GetMaxWidth(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetMaxWidth(IntPtr nativeInstance, int value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern int Internal_GetMinHeight(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetMinHeight(IntPtr nativeInstance, int value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern int Internal_GetMaxHeight(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetMaxHeight(IntPtr nativeInstance, int value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern bool Internal_GetFixedWidth(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetFixedWidth(IntPtr nativeInstance, bool value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern bool Internal_GetFixedHeight(IntPtr nativeInstance);
+        [MethodImpl(MethodImplOptions.InternalCall)] 
+        private static extern void Internal_SetFixedHeight(IntPtr nativeInstance, bool value);
     }
 }

+ 2 - 2
MBansheeEngine/GUIWidget.cs

@@ -1,5 +1,5 @@
 using System;
-using System.Runtime.InteropServices;
+using System.Runtime.CompilerServices;
 
 namespace BansheeEngine
 {
@@ -10,7 +10,7 @@ namespace BansheeEngine
             Internal_CreateInstance(this);
         }
 
-        [DllImport("__Internal")]
+        [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_CreateInstance(GUIWidget instance);
     }
 }

+ 2 - 0
MBansheeEngine/MBansheeEngine.csproj

@@ -12,6 +12,8 @@
     <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <TargetFrameworkProfile />
+    <ProductVersion>10.0.0</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>

+ 3 - 3
MBansheeEngine/Program.cs

@@ -5,12 +5,12 @@ namespace BansheeEngine
 {
     class Program
     {
-        static void Main(string[] args)
+        static void Main()
         {
             GUIElementStateStyle dbgStyle = new GUIElementStateStyle();
-            Color newColor = Color.red;
+            //Color newColor = Color.red;
 
-            dbgStyle.textColor = newColor;
+            //dbgStyle.textColor = newColor;
         }
     }
 }

+ 3 - 8
MBansheeEngine/ScriptObject.cs

@@ -1,10 +1,5 @@
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading.Tasks;
-
+using System.Runtime.CompilerServices;
 namespace BansheeEngine
 {
     public class ScriptObject
@@ -15,8 +10,8 @@ namespace BansheeEngine
         {
             Internal_DestroyInstance(mCachedPtr);
         }
-        
-        [DllImport("__Internal")]
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_DestroyInstance(IntPtr nativeInstance);
     }
 }

+ 2 - 2
MBansheeEngine/SpriteTexture.cs

@@ -1,4 +1,4 @@
-using System.Runtime.InteropServices;
+using System.Runtime.CompilerServices;
 
 namespace BansheeEngine
 {
@@ -9,7 +9,7 @@ namespace BansheeEngine
             Internal_CreateInstance(this);
         }
 
-        [DllImport("__Internal")]
+        [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_CreateInstance(SpriteTexture instance);
     }
 }

+ 2 - 2
MBansheeEngine/Texture2D.cs

@@ -1,5 +1,5 @@
 using System;
-using System.Runtime.InteropServices;
+using System.Runtime.CompilerServices;
 
 namespace BansheeEngine
 {
@@ -10,7 +10,7 @@ namespace BansheeEngine
             Internal_CreateInstance(this, format, width, height, hasMipmaps, gammaCorrection);
         }
 
-        [DllImport("__Internal")]
+        [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_CreateInstance(Texture2D instance, TextureFormat format, int width, int height, bool hasMipmaps, bool gammaCorrection);
     }
 }