private static bool Build(BuildingMod mod, IBuildStatus status)
{
byte[] winDLL = null;
byte[] monoDLL = null;
byte[] winPDB = null;
if (mod.properties.noCompile)
{
winDLL = monoDLL = ReadIfExists(Path.Combine(mod.path, "All.dll"));
winPDB = ReadIfExists(Path.Combine(mod.path, "All.pdb"));
if (winDLL == null)
{
winDLL = ReadIfExists(Path.Combine(mod.path, "Windows.dll"));
monoDLL = ReadIfExists(Path.Combine(mod.path, "Mono.dll"));
winPDB = ReadIfExists(Path.Combine(mod.path, "Windows.pdb"));
}
if (winDLL == null || monoDLL == null)
{
ErrorLogger.LogDllBuildError(mod.path);
return(false);
}
}
else
{
var refMods = FindReferencedMods(mod.properties);
if (refMods == null)
{
return(false);
}
if (Program.LaunchParameters.ContainsKey("-eac"))
{
if (!windows)
{
ErrorLogger.LogBuildError("Edit and continue is only supported on windows");
return(false);
}
try {
status.SetStatus("Loading pre-compiled Windows.dll with edit and continue support");
var winPath = Program.LaunchParameters["-eac"];
var pdbPath = Path.ChangeExtension(winPath, "pdb");
winDLL = File.ReadAllBytes(winPath);
winPDB = File.ReadAllBytes(pdbPath);
mod.properties.editAndContinue = true;
}
catch (Exception e) {
ErrorLogger.LogBuildError("Failed to load pre-compiled edit and continue dll " + e);
return(false);
}
}
else
{
status.SetStatus(Language.GetTextValue("tModLoader.MSCompilingWindows", mod));
status.SetProgress(0, 2);
CompileMod(mod, refMods, true, ref winDLL, ref winPDB);
}
if (winDLL == null)
{
return(false);
}
status.SetStatus(Language.GetTextValue("tModLoader.MSCompilingMono", mod));
status.SetProgress(1, 2);
CompileMod(mod, refMods, false, ref monoDLL, ref winPDB); //the pdb reference won't actually be written to
if (monoDLL == null)
{
return(false);
}
}
if (!VerifyName(mod.Name, winDLL) || !VerifyName(mod.Name, monoDLL))
{
return(false);
}
status.SetStatus(Language.GetTextValue("tModLoader.MSBuilding") + mod + "...");
status.SetProgress(0, 1);
mod.modFile.AddFile("Info", mod.properties.ToBytes());
if (Equal(winDLL, monoDLL))
{
mod.modFile.AddFile("All.dll", winDLL);
if (winPDB != null)
{
mod.modFile.AddFile("All.pdb", winPDB);
}
}
else
{
mod.modFile.AddFile("Windows.dll", winDLL);
mod.modFile.AddFile("Mono.dll", monoDLL);
if (winPDB != null)
{
mod.modFile.AddFile("Windows.pdb", winPDB);
}
}
foreach (var resource in Directory.GetFiles(mod.path, "*", SearchOption.AllDirectories))
{
var relPath = resource.Substring(mod.path.Length + 1);
if (mod.properties.ignoreFile(relPath) ||
relPath == "build.txt" ||
relPath == ".gitattributes" ||
relPath == ".gitignore" ||
relPath.StartsWith(".git" + Path.DirectorySeparatorChar) ||
relPath.StartsWith(".vs" + Path.DirectorySeparatorChar) ||
relPath.StartsWith("bin" + Path.DirectorySeparatorChar) ||
relPath.StartsWith("obj" + Path.DirectorySeparatorChar) ||
!mod.properties.includeSource && sourceExtensions.Contains(Path.GetExtension(resource)) ||
Path.GetFileName(resource) == "Thumbs.db")
{
continue;
}
mod.modFile.AddFile(relPath, File.ReadAllBytes(resource));
}
WAVCacheIO.ClearCache(mod.Name);
mod.modFile.Save();
EnableMod(mod.modFile);
ActivateExceptionReporting();
ModLoader.isModder = true;
return(true);
}