diff --git a/Development/Documentation/mono.md b/Development/Documentation/mono.md index d292ebb3d..4a880b7a0 100644 --- a/Development/Documentation/mono.md +++ b/Development/Documentation/mono.md @@ -2,6 +2,8 @@ Custom fork: [https://github.com/FlaxEngine/mono](https://github.com/FlaxEngine/mono) with custom features for C# assemblies hot-reloading at runtime without domain unload (more: [https://flaxengine.com/blog/flax-facts-16-scripts-hot-reload/](https://flaxengine.com/blog/flax-facts-16-scripts-hot-reload/)). +Startup docs about building mono: [https://www.mono-project.com/docs/compiling-mono/](https://www.mono-project.com/docs/compiling-mono/) + ### Notes Some useful notes and tips for devs: diff --git a/Source/Engine/Content/JsonAsset.cpp b/Source/Engine/Content/JsonAsset.cpp index e8aa901d9..2332181b9 100644 --- a/Source/Engine/Content/JsonAsset.cpp +++ b/Source/Engine/Content/JsonAsset.cpp @@ -281,9 +281,10 @@ bool JsonAsset::CreateInstance() void JsonAsset::DeleteInstance() { - ASSERT_LOW_LAYER(Instance && _dtor); - InstanceType = ScriptingTypeHandle(); + if (!Instance || !_dtor) + return; _dtor(Instance); + InstanceType = ScriptingTypeHandle(); Allocator::Free(Instance); Instance = nullptr; _dtor = nullptr; diff --git a/Source/Engine/Scripting/BinaryModule.h b/Source/Engine/Scripting/BinaryModule.h index 5ea3713c5..73144c449 100644 --- a/Source/Engine/Scripting/BinaryModule.h +++ b/Source/Engine/Scripting/BinaryModule.h @@ -260,7 +260,7 @@ public: private: - int32 _firstManagedTypeIndex; + int32 _firstManagedTypeIndex = 0; Array _managedMemoryBlocks; public: diff --git a/Source/Engine/Scripting/ManagedCLR/MAssembly.cpp b/Source/Engine/Scripting/ManagedCLR/MAssembly.cpp index 8471f02cb..996bbb420 100644 --- a/Source/Engine/Scripting/ManagedCLR/MAssembly.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MAssembly.cpp @@ -352,6 +352,7 @@ bool MAssembly::LoadWithImage(const String& assemblyPath) } } + // TODO: load pdbs for custom third-party libs referenced by game assemblies for debugging #if 0 // Hack to load debug information for Newtonsoft.Json (enable it to debug C# code of json lib) if (assemblyPath.EndsWith(TEXT("FlaxEngine.CSharp.dll"))) diff --git a/Source/Engine/Scripting/ManagedCLR/MCore.cpp b/Source/Engine/Scripting/ManagedCLR/MCore.cpp index 91f12cfb0..f7b46e5cc 100644 --- a/Source/Engine/Scripting/ManagedCLR/MCore.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MCore.cpp @@ -2,7 +2,6 @@ #include "MCore.h" #include "MDomain.h" -#include "MClass.h" #include "Engine/Core/Log.h" #include "Engine/Core/Types/String.h" #include "Engine/Core/Types/DateTime.h" @@ -353,6 +352,9 @@ bool MCore::LoadEngine() PROFILE_CPU(); ASSERT(Globals::MonoPath.IsANSI()); + // Debugging Mono GC + //Platform::SetEnvironmentVariable(TEXT("MONO_GC_DEBUG"), TEXT("6:gc-log.txt,check-remset-consistency,nursery-canaries")); + #if 0 // Override memory allocation callback // TODO: use ENABLE_OVERRIDABLE_ALLOCATORS when building Mono to support memory callbacks or use counters for memory profiling diff --git a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp index 3b46e4f36..aa5d1a6a1 100644 --- a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp @@ -114,7 +114,7 @@ MonoString* MUtils::ToString(const String& str) MonoString* MUtils::ToString(const String& str, MonoDomain* domain) { if (str.IsEmpty()) - return mono_string_empty(mono_domain_get()); + return mono_string_empty(domain); return mono_string_new_utf16(domain, (const mono_unichar2*)*str, str.Length()); } diff --git a/Source/Engine/Scripting/ManagedSerialization.cpp b/Source/Engine/Scripting/ManagedSerialization.cpp index 97560701c..1fa799d56 100644 --- a/Source/Engine/Scripting/ManagedSerialization.cpp +++ b/Source/Engine/Scripting/ManagedSerialization.cpp @@ -10,7 +10,7 @@ #include "ManagedCLR/MMethod.h" #include -void ManagedSerialization::Serialize(ISerializable::SerializeStream& stream, MonoObject* object) +void ManagedSerialization::Serialize(ISerializable::SerializeStream& stream, MObject* object) { if (!object) { @@ -47,7 +47,7 @@ void ManagedSerialization::Serialize(ISerializable::SerializeStream& stream, Mon mono_free(invokeResultChars); } -void ManagedSerialization::SerializeDiff(ISerializable::SerializeStream& stream, MonoObject* object, MonoObject* other) +void ManagedSerialization::SerializeDiff(ISerializable::SerializeStream& stream, MObject* object, MObject* other) { if (!object || !other) { @@ -85,7 +85,7 @@ void ManagedSerialization::SerializeDiff(ISerializable::SerializeStream& stream, mono_free(invokeResultChars); } -void ManagedSerialization::Deserialize(ISerializable::DeserializeStream& stream, MonoObject* object) +void ManagedSerialization::Deserialize(ISerializable::DeserializeStream& stream, MObject* object) { if (!object) return; @@ -98,7 +98,7 @@ void ManagedSerialization::Deserialize(ISerializable::DeserializeStream& stream, Deserialize(StringAnsiView(buffer.GetString(), (int32)buffer.GetSize()), object); } -void ManagedSerialization::Deserialize(const StringAnsiView& data, MonoObject* object) +void ManagedSerialization::Deserialize(const StringAnsiView& data, MObject* object) { const char* str = data.Get(); const int32 len = data.Length(); diff --git a/Source/Engine/Scripting/ManagedSerialization.h b/Source/Engine/Scripting/ManagedSerialization.h index fdcccdcd1..10495dd36 100644 --- a/Source/Engine/Scripting/ManagedSerialization.h +++ b/Source/Engine/Scripting/ManagedSerialization.h @@ -18,7 +18,7 @@ public: /// /// The output stream. /// The object to serialize. - static void Serialize(ISerializable::SerializeStream& stream, MonoObject* object); + static void Serialize(ISerializable::SerializeStream& stream, MObject* object); /// /// Serializes managed object difference to JSON. @@ -26,20 +26,20 @@ public: /// The output stream. /// The object to serialize. /// The reference object to serialize diff compared to it. - static void SerializeDiff(ISerializable::SerializeStream& stream, MonoObject* object, MonoObject* other); + static void SerializeDiff(ISerializable::SerializeStream& stream, MObject* object, MObject* other); /// /// Deserializes managed object from the JSON. /// /// The input stream. /// The object to deserialize. - static void Deserialize(ISerializable::DeserializeStream& stream, MonoObject* object); + static void Deserialize(ISerializable::DeserializeStream& stream, MObject* object); /// /// Deserializes managed object from the JSON. /// /// The input data. /// The object to deserialize. - static void Deserialize(const StringAnsiView& data, MonoObject* object); + static void Deserialize(const StringAnsiView& data, MObject* object); #endif }; diff --git a/Source/Tools/Flax.Build/Build/DotNet/Builder.DotNet.cs b/Source/Tools/Flax.Build/Build/DotNet/Builder.DotNet.cs index c549ae84b..1637524c2 100644 --- a/Source/Tools/Flax.Build/Build/DotNet/Builder.DotNet.cs +++ b/Source/Tools/Flax.Build/Build/DotNet/Builder.DotNet.cs @@ -160,7 +160,7 @@ namespace Flax.Build // Prefer installed Roslyn C# compiler over Mono one monoPath = null; - cscPath = Path.Combine(Path.GetDirectoryName(Deploy.VCEnvironment.MSBuildPath), "Roslyn", "csc.exe"); + cscPath = Path.Combine(Path.GetDirectoryName(VCEnvironment.MSBuildPath), "Roslyn", "csc.exe"); if (!File.Exists(cscPath)) { diff --git a/Source/Tools/Flax.Build/Utilities/Utilities.cs b/Source/Tools/Flax.Build/Utilities/Utilities.cs index e693c1b42..a9a97bac0 100644 --- a/Source/Tools/Flax.Build/Utilities/Utilities.cs +++ b/Source/Tools/Flax.Build/Utilities/Utilities.cs @@ -244,6 +244,26 @@ namespace Flax.Build } } + /// + /// Deletes the directories inside a directory. + /// + /// The directory path. + /// The custom filter for the directories to delete. Can be used to select files to delete. Null if unused. + /// if set to true with sub-directories (recursive delete operation). + public static void DirectoriesDelete(string directoryPath, string searchPattern = null, bool withSubdirs = true) + { + if (!Directory.Exists(directoryPath)) + return; + if (searchPattern == null) + searchPattern = "*"; + + var directories = Directory.GetDirectories(directoryPath, searchPattern, withSubdirs ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); + for (int i = 0; i < directories.Length; i++) + { + DirectoryDelete(directories[i]); + } + } + /// /// The process run options. ///