summaryrefslogtreecommitdiff
path: root/Runtime/Scripting/MonoManager_WinRT.cpp
blob: 7719478edfc83a33fdd748910ff8e1e3248cbb09 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "UnityPrefix.h"

#include "MonoManager_WinRT.h"
#include "Runtime/Serialize/TransferFunctions/SerializeTransfer.h"
#include "Runtime/Mono/MonoScript.h"
#include "Runtime/BaseClasses/ManagerContext.h"
#include "Runtime/Scripting/CommonScriptingClasses.h"
#include "Runtime/Scripting/ScriptingUtility.h"
#include "Runtime/Scripting/Backend/ScriptingBackendApi.h"

#include "Runtime/Scripting/Backend/Metro/ScriptingTypeProvider_Metro.h"
#include "Runtime/Scripting/Backend/Metro/ScriptingMethodFactory_Metro.h"

#include "Runtime/Scripting/Backend/ScriptingMethodRegistry.h"

#include "Runtime/Mono/MonoBehaviourSerialization_ByCodeGeneration.h"

#include "PlatformDependent/MetroPlayer/MetroUtils.h"

MonoManager::MonoManager (MemLabelId label, ObjectCreationMode mode)
	: ScriptingManager(label, mode, UNITY_NEW( ScriptingTypeProvider_Metro(), kMemManager), UNITY_NEW( ScriptingMethodFactory_Metro(), kMemManager))
{
	METRO_DBG_MARK_TIME("MonoManager::ctor");
	InputString data;
	const char* managedAssemblies = "managedAssemblies.txt";
	if (ReadStringFromFile(&data, PathToAbsolutePath(managedAssemblies)))
	{
		GetWinRTUtils()->LoadAssemblies(ConvertUtf8ToString(data.c_str()));
	}
	else
	{
		FatalErrorMsg("Failed to load %s", managedAssemblies);
	}
	METRO_DBG_MARK_TIME("MonoManager::FillCommonScriptingClasses begin...");
	FillCommonScriptingClasses(m_CommonScriptingClasses);
	METRO_DBG_MARK_TIME("MonoManager::FillCommonScriptingClasses end...");
	SetupExceptionHandler();
	SetupMarshalCallbacks();
	void RegisterAllInternalCalls();
	RegisterAllInternalCalls();

#	if ENABLE_SERIALIZATION_BY_CODEGENERATION

		s_WinRTBridge->SetupSerializationReader(
				(long long)(NativeExt_MonoBehaviourSerialization_ReaderAlign),
				(long long)(NativeExt_MonoBehaviourSerialization_ReadBuffer),
				(long long)(NativeExt_MonoBehaviourSerialization_ReadUnityEngineObject),
				(long long)(NativeExt_MonoBehaviourSerialization_ReadGUIStyle),
				(long long)(NativeExt_MonoBehaviourSerialization_ReadRectOffset),
				(long long)(NativeExt_MonoBehaviourSerialization_ReadAnimationCurve),
				(long long)(NativeExt_MonoBehaviourSerialization_ReadGradient));

		s_WinRTBridge->SetupSerializationWriter(
				(long long)(NativeExt_MonoBehaviourSerialization_WriterAlign),
				(long long)(NativeExt_MonoBehaviourSerialization_WriteBuffer),
				(long long)(NativeExt_MonoBehaviourSerialization_WriteUnityEngineObject),
				(long long)(NativeExt_MonoBehaviourSerialization_WriteGUIStyle),
				(long long)(NativeExt_MonoBehaviourSerialization_WriteRectOffset),
				(long long)(NativeExt_MonoBehaviourSerialization_WriteAnimationCurve),
				(long long)(NativeExt_MonoBehaviourSerialization_WriteGradient));

		s_WinRTBridge->SetupSerializationRemapper(
				(long long)(NativeExt_MonoBehaviourSerialization_GetNewInstanceToReplaceOldInstance));

		ScriptingInvocation initManagedAnalysis(GetScriptingMethodRegistry().GetMethod("UnityEngine.Serialization","ManagedLivenessAnalysis","Init"));
		initManagedAnalysis.Invoke();
#	endif
	// It tries to get classes like LevelGameManager which doesn't exist in managed land, is this intended?
	RebuildClassIDToScriptingClass();

#	if !ENABLE_WINRT_PINVOKE
	METRO_DBG_MARK_TIME("MonoManager::SetupDelegates begin...");
	GetWinRTUtils()->SetupDelegates();
	METRO_DBG_MARK_TIME("MonoManager::SetupDelegates end...");
#	else
	if (GetWinRTUtils()->IsPlatformInvokeSupported() == false)
		FatalErrorMsg("WinRTBridge: Platform Invoke should be supported on this platform.");
	if (UnityEngineDelegates::PlatformInvoke::IsSupported() == false)
		FatalErrorMsg("UnityEngineDelegates: Platform Invoke should be supported on this platform.");
#	endif

}

MonoManager::~MonoManager ()
{

}

template<class TransferFunction>
void MonoManager::Transfer (TransferFunction& transfer)
{
	Super::Transfer (transfer);
	transfer.SetVersion(2);
	transfer.Transfer (m_MonoScriptManager.m_RuntimeScripts, "m_Scripts");

	// ToDo: Temporary fix if we're deserializing for metro see MonoManager::Transfer function
	std::vector<UnityStr> assemblyNames;
	transfer.Transfer (assemblyNames, "m_AssemblyNames");
}


IMPLEMENT_OBJECT_SERIALIZE (MonoManager)
IMPLEMENT_CLASS (MonoManager)
GET_MANAGER (MonoManager)
GET_MANAGER_PTR (MonoManager)