Explorar o código

准备嵌入mono,用csharp作为脚本

tanghai %!s(int64=14) %!d(string=hai) anos
pai
achega
06807c4c50

+ 4 - 0
Cpp/CMakeLists.txt

@@ -23,6 +23,9 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/Game)
 INCLUDE_DIRECTORIES(ThirdParty)
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/ThirdParty)
 
+FIND_PACKAGE(GLog REQUIRED)
+INCLUDE_DIRECTORIES(${GLOG_INCLUDE_DIR})
+
 FIND_PACKAGE(Protobuf REQUIRED)
 INCLUDE_DIRECTORIES(${PROTOBUF_INCLUDE_DIR})
 LINK_DIRECTORIES(${PROTOBUF_LIBRARY_DIR})
@@ -41,6 +44,7 @@ LINK_DIRECTORIES(${Boost_LIBRARY_DIR})
 SET(ThirdPartyLibs
 	gtest
 	gmock
+	${GLOG_LIBRARIES}
 	${PROTOBUF_LIBRARIES}
 	${Boost_LIBRARIES}
 	${PERFTOOLS_DEBUG_LIBRARIES}

+ 49 - 0
Cpp/Platform/Mono/MonoInit.cc

@@ -0,0 +1,49 @@
+// Copyright: All Rights Reserved
+// Author: egametang@gmail.com (tanghai)
+
+#include <glog/logging.h>
+#include <mono/jit/jit.h>
+#include <mono/metadata/assembly.h>
+#include <mono/metadata/debug-helpers.h>
+#include <mono/metadata/mono-gc.h>
+#include <mono/metadata/class.h>
+#include "Mono/MonoInit.h"
+
+namespace Egametang {
+
+MonoInit::MonoInit(const std::string & domainName)
+{
+	domain = mono_jit_init(domainName.c_str());
+}
+
+MonoInit::~MonoInit()
+{
+    mono_jit_cleanup(domain);
+}
+
+void MonoInit::LoadAssembly(const std::string& fileName)
+{
+	MonoAssembly* assembly = mono_domain_assembly_open(domain, fileName.c_str());
+	MonoImage* image = mono_assembly_get_image(assembly);
+	imageMap[fileName] = image;
+}
+
+void MonoInit::InvokeMethod(const std::string& className, const std::string& methodName)
+{
+	MonoImage* image = imageMap[className];
+	CHECK(image) << "not found image: " << className << "::" << methodName;
+	std::string fullName = className + ":" + methodName;
+	MonoMethodDesc* desc = mono_method_desc_new(fullName.c_str(), 1);
+	MonoMethod* monoMethod = mono_method_desc_search_in_image(desc, image);
+	MonoClass* monoClass = mono_method_get_class(monoMethod);
+	MonoObject* newInstance = mono_object_new(domain, monoClass);
+	MonoObject* exc;
+	MonoObject* ret = mono_runtime_invoke(monoMethod, newInstance, 0, &exc);
+}
+
+void MonoInit::InvokeMain(const char *file, int argc, char** argv)
+{
+
+}
+
+} // namespace Egametang

+ 6 - 0
Cpp/Platform/Mono/MonoInit.cs

@@ -0,0 +1,6 @@
+class MonoInit
+{
+	static void Foo(int value)
+	{
+	}
+}

+ 29 - 0
Cpp/Platform/Mono/MonoInit.h

@@ -0,0 +1,29 @@
+// Copyright: All Rights Reserved
+// Author: egametang@gmail.com (tanghai)
+
+#ifndef MONO_MONOINIT_H
+#define MONO_MONOINIT_H
+
+#include <string>
+#include <mono/jit/jit.h>
+#include <mono/metadata/assembly.h>
+
+namespace Egametang {
+
+class MonoInit
+{
+private:
+	MonoDomain *domain;
+	boost::unordered_map<std::string, MonoImage*> imageMap;
+
+public:
+	MonoInit(const std::string& domainName);
+	virtual ~MonoInit();
+
+	void LoadAssembly(const std::string& assemblyName);
+	void InvokeMethod(const std::string& className, const std::string& functionName);
+	void InvokeMain(const char *file, int argc, char** argv);
+};
+
+} // namespace Egametang
+#endif // MONO_MONOINIT_H

+ 8 - 0
Cpp/Platform/Mono/MonoInitTest.cc

@@ -0,0 +1,8 @@
+// Copyright: All Rights Reserved
+// Author: egametang@gmail.com (tanghai)
+
+#include "MonoInit.h"
+
+namespace Egametang {
+
+} // namespace Egametang