Explorar el Código

Deploying standalone Windows apps using CoreCLR

JoshEngebretson hace 10 años
padre
commit
ec7b6f6ca9

+ 1 - 1
Jakefile

@@ -520,7 +520,7 @@ namespace('package', function() {
     fs.copySync(jakeRoot + "/Data/AtomicEditor/", windowsPackageFolder + "/Resources/ToolData");
 
     // AtomicNET
-    fs.copySync(jakeRoot + "/Submodules/CoreCLR/Windows/Debug", windowsPackageFolder + "/Resources/AtomicNET/Windows/");
+    fs.copySync(jakeRoot + "/Submodules/CoreCLR/Windows/Release", windowsPackageFolder + "/Resources/AtomicNET/Windows/");
     fs.copySync(jakeRoot + "/Artifacts/AtomicNET", windowsPackageFolder + "/Resources/AtomicNET/Windows/Atomic");
 
     fs.copySync(jakeRoot + "/Build/Windows/Binaries/x86/D3DCompiler_47.dll", windowsPackageFolder + "/Resources/ToolData/Deployment/Windows/x86/D3DCompiler_47.dll");

+ 40 - 0
Source/AtomicPlayer/Application/AtomicPlayer.cpp

@@ -38,6 +38,11 @@
 
 #include <AtomicJS/Javascript/Javascript.h>
 
+#ifdef ATOMIC_DOTNET
+#include <AtomicNET/NETCore/NETCore.h>
+#include <AtomicNET/NETCore/NETHost.h>
+#endif
+
 #include <AtomicPlayer/Player.h>
 
 #include "AtomicPlayer.h"
@@ -90,8 +95,10 @@ void AtomicPlayerApp::Setup()
 #endif
 
 #if ATOMIC_PLATFORM_WINDOWS
+
     engineParameters_["WindowIcon"] = "Images/AtomicLogo32.png";
     engineParameters_["ResourcePrefixPath"] = "AtomicPlayer_Resources";
+
 #elif ATOMIC_PLATFORM_ANDROID
     //engineParameters_["ResourcePrefixPath"] = "assets";
 #elif ATOMIC_PLATFORM_OSX
@@ -122,6 +129,8 @@ void AtomicPlayerApp::Start()
 {
     Application::Start();
 
+    FileSystem* fileSystem = GetSubsystem<FileSystem>();
+
     // Instantiate and register the Javascript subsystem
     Javascript* javascript = new Javascript(context_);
     context_->RegisterSubsystem(javascript);
@@ -143,6 +152,37 @@ void AtomicPlayerApp::Start()
 
     JSVM* vm = JSVM::GetJSVM(0);
 
+#ifdef ATOMIC_DOTNET
+
+    // Instantiate and register the AtomicNET subsystem
+    SharedPtr<NETCore> netCore (new NETCore(context_));
+    context_->RegisterSubsystem(netCore);
+    String netCoreErrorMsg;
+
+#ifdef ATOMIC_PLATFORM_WINDOWS
+
+    String rootNETDir = fileSystem->GetProgramDir() + "AtomicPlayer_Resources/AtomicNET/";
+
+#else
+
+#endif
+
+    NETHost::SetCoreCLRFilesAbsPath(GetNativePath(rootNETDir + "CoreCLR/"));
+    NETHost::SetCoreCLRTPAPaths(GetNativePath(rootNETDir + "Atomic/TPA/"));
+    NETHost::SetCoreCLRAssemblyLoadPaths(GetNativePath(rootNETDir + "Atomic/Assemblies/"));
+
+    if (!netCore->Initialize(netCoreErrorMsg))
+    {
+        LOGERRORF("NetCore: Unable to initialize! %s", netCoreErrorMsg.CString());
+        context_->RemoveSubsystem(NETCore::GetTypeStatic());
+    }
+    else
+    {
+
+    }
+#endif
+
+
     if (!vm->ExecuteMain())
     {
         SendEvent(E_EXITREQUESTED);

+ 10 - 1
Source/AtomicPlayer/Application/CMakeLists.txt

@@ -1,10 +1,16 @@
 
 include_directories(${CMAKE_SOURCE_DIR}/Source)
-include_directories(${CMAKE_SOURCE_DIR}/Source/ThirdParty)
+include_directories ( ${CMAKE_SOURCE_DIR}/Source/ThirdParty
+                              ${CMAKE_SOURCE_DIR}/Source/ThirdParty/rapidjson/include
+                              ${CMAKE_SOURCE_DIR}/Source/ThirdParty/kNet/include
+                              ${CMAKE_SOURCE_DIR}/Source/ThirdParty/FreeType/include
+                              ${CMAKE_SOURCE_DIR}/Source/ThirdParty/Box2D )
 
 # Define source files
 file (GLOB SOURCE_FILES *.cpp *.h )
 
+set (SOURCE_FILES ${SOURCE_FILES} ${CSHARP_BINDINGS_SOURCE} ${CSHARPATOMICPLAYER_BINDINGS_SOURCE}  ${CSHARPATOMICNET_BINDINGS_SOURCE})
+
 if (MSVC)
     set (EXE_TYPE WIN32)
     set (SOURCE_FILES ${SOURCE_FILES} ${CMAKE_SOURCE_DIR}/CMake/Modules/Atomic.rc)
@@ -32,6 +38,9 @@ if (MSVC)
   add_custom_command (TARGET AtomicPlayer POST_BUILD
   COMMAND ${CMAKE_COMMAND}
   ARGS -E copy_if_different \"${D3DCOMPILER_47_DLL}\" \"$<TARGET_FILE_DIR:AtomicPlayer>/D3DCompiler_47.dll\")
+
+    target_link_libraries(AtomicPlayer NETCore)
+
 endif()
 
 if (APPLE)

+ 68 - 0
Source/ToolCore/Build/BuildWindows.cpp

@@ -5,6 +5,7 @@
 // license information: https://github.com/AtomicGameEngine/AtomicGameEngine
 //
 
+#include <Atomic/Core/StringUtils.h>
 #include <Atomic/IO/FileSystem.h>
 
 #include "../ToolSystem.h"
@@ -47,6 +48,71 @@ void BuildWindows::Initialize()
 
     BuildResourceEntries();
 
+}
+
+void BuildWindows::BuildAtomicNET()
+{
+    // AtomicNET
+
+    FileSystem* fileSystem = GetSubsystem<FileSystem>();
+    ToolEnvironment* tenv = GetSubsystem<ToolEnvironment>();
+    ToolSystem* tsystem = GetSubsystem<ToolSystem>();
+    Project* project = tsystem->GetProject();
+    String projectResources = project->GetResourcePath();
+
+    String assembliesPath = projectResources + "Assemblies/";
+
+    // if no assemblies path, no need to install AtomicNET
+    if (!fileSystem->DirExists(assembliesPath))
+        return;
+
+    Vector<String> results;
+    fileSystem->ScanDir(results, assembliesPath, "*.dll", SCAN_FILES, true);
+
+    // if no assembiles in Assemblies path, no need to install AtomicNET
+    if (!results.Size())
+        return;
+
+    fileSystem->CreateDir(buildPath_ + "/AtomicPlayer_Resources/AtomicNET");
+    fileSystem->CreateDir(buildPath_ + "/AtomicPlayer_Resources/AtomicNET/Atomic");
+    fileSystem->CreateDir(buildPath_ + "/AtomicPlayer_Resources/AtomicNET/Atomic/Assemblies");
+
+    fileSystem->CopyDir(tenv->GetNETCoreCLRAbsPath(), buildPath_ + "/AtomicPlayer_Resources/AtomicNET/CoreCLR");
+    fileSystem->CopyDir(tenv->GetNETTPAPaths(), buildPath_ + "/AtomicPlayer_Resources/AtomicNET/Atomic/TPA");
+
+    // Atomic Assemblies
+
+    const String& assemblyLoadPaths = tenv->GetNETAssemblyLoadPaths();
+    Vector<String> paths = assemblyLoadPaths.Split(';');
+
+    for (unsigned i = 0; i < paths.Size(); i++)
+    {
+        Vector<String> loadResults;
+        fileSystem->ScanDir(loadResults, paths[i], "*.dll", SCAN_FILES, true);
+
+        for (unsigned j = 0; j < loadResults.Size(); j++)
+        {
+            String pathName, fileName, ext;
+            SplitPath(loadResults[j], pathName, fileName, ext);
+
+            if (fileName != "AtomicNETEngine")
+                continue;
+
+            fileSystem->Copy(paths[i] + "/" + loadResults[j], ToString("%s/AtomicPlayer_Resources/AtomicNET/Atomic/Assemblies/%s.dll", buildPath_.CString(), fileName.CString()));
+        }
+
+    }
+
+    // Project assemblied
+    for (unsigned i = 0; i < results.Size(); i++)
+    {
+        String pathName, fileName, ext;
+        SplitPath(results[i], pathName, fileName, ext);
+        fileSystem->Copy(assembliesPath + results[i], ToString("%s/AtomicPlayer_Resources/AtomicNET/Atomic/Assemblies/%s.dll", buildPath_.CString(), fileName.CString()));
+    }
+
+
+
 }
 
 void BuildWindows::Build(const String& buildPath)
@@ -77,6 +143,8 @@ void BuildWindows::Build(const String& buildPath)
     fileSystem->Copy(playerBinary, buildPath_ + "/AtomicPlayer.exe");
     fileSystem->Copy(d3d9dll, buildPath_ + "/D3DCompiler_47.dll");
 
+    BuildAtomicNET();
+
     buildSystem->BuildComplete(PLATFORMID_WINDOWS, buildPath_);
 
 }

+ 4 - 0
Source/ToolCore/Build/BuildWindows.h

@@ -31,6 +31,10 @@ protected:
 
     void Initialize();
 
+private:
+
+    void BuildAtomicNET();
+
 };
 
 }

+ 3 - 4
Source/ToolCore/ToolEnvironment.cpp

@@ -61,8 +61,7 @@ bool ToolEnvironment::InitFromPackage()
 
 #ifdef ATOMIC_PLATFORM_WINDOWS
     netCoreCLRAbsPath_ = GetNativePath(ToString("%sAtomicNET/Windows/x64/", resourcesDir.CString()));
-    netTPAPaths_ = ToString("%sAtomicNET/Windows/AnyCPU/TPA/", resourcesDir.CString());
-    netTPAPaths_ += ToString(";%sAtomicNET/Windows/Atomic/TPA/", resourcesDir.CString());
+    netTPAPaths_ = ToString("%sAtomicNET/Windows/Atomic/TPA/", resourcesDir.CString());
 #else
     String  coreCLRAbsPath = GetNativePath(ToString("%s/Submodules/CoreCLR/OSX/Debug/x64/", ATOMIC_ROOT_SOURCE_DIR);
 #endif
@@ -168,8 +167,8 @@ void ToolEnvironment::SetRootBuildDir(const String& buildDir, bool setBinaryPath
 #ifdef ATOMIC_PLATFORM_WINDOWS
 
 #ifdef _DEBUG
-        playerBinary_ = rootBuildDir_ + "Source/AtomicPlayer/Application/Debug/AtomicPlayer.exe";
-        editorBinary_ = rootBuildDir_ + "Source/AtomicEditor/Debug/AtomicEditor.exe";
+        playerBinary_ = rootBuildDir_ + "Source/AtomicPlayer/Application/AtomicPlayer.exe";
+        editorBinary_ = rootBuildDir_ + "Source/AtomicEditor/AtomicEditor.exe";
 #else
         playerBinary_ = rootBuildDir_ + "Source/AtomicPlayer/Application/Release/AtomicPlayer.exe";
         editorBinary_ = rootBuildDir_ + "Source/AtomicEditor/Release/AtomicEditor.exe";