Files
RothenburgAR/Assets/AssetBundleManager/Editor/ExecuteInternalMono.cs

129 lines
3.6 KiB
C#

using UnityEditor;
using UnityEngine;
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System;
namespace AssetBundles
{
class MonoInstallationFinder
{
public static string GetFrameWorksFolder()
{
var editorAppPath = EditorApplication.applicationPath;
if (Application.platform == RuntimePlatform.WindowsEditor)
return Path.Combine(Path.GetDirectoryName(editorAppPath), "Data");
else if (Application.platform == RuntimePlatform.OSXEditor)
return Path.Combine(editorAppPath, Path.Combine("Contents", "Frameworks"));
else // Linux...?
return Path.Combine(Path.GetDirectoryName(editorAppPath), "Data");
}
public static string GetProfileDirectory (BuildTarget target, string profile)
{
var monoprefix = GetMonoInstallation();
return Path.Combine(monoprefix, Path.Combine("lib", Path.Combine("mono", profile)));
}
public static string GetMonoInstallation()
{
#if INCLUDE_MONO_2_12
return GetMonoInstallation("MonoBleedingEdge");
#else
return GetMonoInstallation("Mono");
#endif
}
public static string GetMonoInstallation(string monoName)
{
return Path.Combine(GetFrameWorksFolder(), monoName);
}
}
class ExecuteInternalMono
{
private static readonly Regex UnsafeCharsWindows = new Regex("[^A-Za-z0-9\\_\\-\\.\\:\\,\\/\\@\\\\]");
private static readonly Regex UnescapeableChars = new Regex("[\\x00-\\x08\\x10-\\x1a\\x1c-\\x1f\\x7f\\xff]");
private static readonly Regex Quotes = new Regex("\"");
public ProcessStartInfo processStartInfo = null;
public static string PrepareFileName(string input)
{
if (Application.platform == RuntimePlatform.OSXEditor)
{
return EscapeCharsQuote(input);
}
return EscapeCharsWindows(input);
}
public static string EscapeCharsQuote(string input)
{
if (input.IndexOf('\'') == -1)
{
return "'" + input + "'";
}
if (input.IndexOf('"') == -1)
{
return "\"" + input + "\"";
}
return null;
}
public static string EscapeCharsWindows(string input)
{
if (input.Length == 0)
{
return "\"\"";
}
if (UnescapeableChars.IsMatch(input))
{
UnityEngine.Debug.LogWarning("Cannot escape control characters in string");
return "\"\"";
}
if (UnsafeCharsWindows.IsMatch(input))
{
return "\"" + Quotes.Replace(input, "\"\"") + "\"";
}
return input;
}
public static ProcessStartInfo GetProfileStartInfoForMono(string monodistribution, string profile, string executable, string arguments, bool setMonoEnvironmentVariables)
{
var monoexe = PathCombine(monodistribution, "bin", "mono");
var profileAbspath = PathCombine(monodistribution, "lib", "mono", profile);
if (Application.platform == RuntimePlatform.WindowsEditor)
monoexe = PrepareFileName(monoexe + ".exe");
var startInfo = new ProcessStartInfo
{
Arguments = PrepareFileName(executable) + " " + arguments,
CreateNoWindow = true,
FileName = monoexe,
RedirectStandardError = true,
RedirectStandardOutput = true,
WorkingDirectory = Application.dataPath + "/..",
UseShellExecute = false
};
if (setMonoEnvironmentVariables)
{
startInfo.EnvironmentVariables["MONO_PATH"] = profileAbspath;
startInfo.EnvironmentVariables["MONO_CFG_DIR"] = PathCombine(monodistribution, "etc");
}
return startInfo;
}
static string PathCombine(params string[] parts)
{
var path = parts[0];
for (var i = 1; i < parts.Length; ++i)
path = Path.Combine(path, parts[i]);
return path;
}
}
}