You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.9 KiB
78 lines
2.9 KiB
using System;
|
|
using System.Linq;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
|
|
namespace XLua
|
|
{
|
|
public class XLuaHotfixInject
|
|
{
|
|
public static void Useage()
|
|
{
|
|
Console.WriteLine("XLuaHotfixInject assmbly_path id_map_file_path [cfg_assmbly2_path] [search_path1, search_path2 ...]");
|
|
}
|
|
|
|
public static void Main(string[] args)
|
|
{
|
|
if (args.Length < 2)
|
|
{
|
|
Useage();
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
var injectAssmblyPath = Path.GetFullPath(args[0]);
|
|
var xluaAssmblyPath = Path.GetFullPath(args[1]);
|
|
string cfg_append = null;
|
|
if (args.Length > 3)
|
|
{
|
|
cfg_append = Path.GetFullPath(args[3]);
|
|
if (!cfg_append.EndsWith(".data"))
|
|
{
|
|
cfg_append = null;
|
|
}
|
|
}
|
|
AppDomain currentDomain = AppDomain.CurrentDomain;
|
|
List<string> search_paths = args.Skip(cfg_append == null ? 3 : 4).ToList();
|
|
currentDomain.AssemblyResolve += new ResolveEventHandler((object sender, ResolveEventArgs rea) =>
|
|
{
|
|
foreach (var search_path in search_paths)
|
|
{
|
|
string assemblyPath = Path.Combine(search_path, new AssemblyName(rea.Name).Name + ".dll");
|
|
if (File.Exists(assemblyPath))
|
|
{
|
|
return Assembly.Load(File.ReadAllBytes(assemblyPath));
|
|
}
|
|
}
|
|
return null;
|
|
});
|
|
var assembly = Assembly.Load(File.ReadAllBytes(injectAssmblyPath));
|
|
var hotfixCfg = new Dictionary<string, int>();
|
|
HotfixConfig.GetConfig(hotfixCfg, assembly.GetTypes());
|
|
if (cfg_append != null)
|
|
{
|
|
using (BinaryReader reader = new BinaryReader(File.Open(cfg_append, FileMode.Open)))
|
|
{
|
|
int count = reader.ReadInt32();
|
|
for(int i = 0; i < count; i++)
|
|
{
|
|
string k = reader.ReadString();
|
|
int v = reader.ReadInt32();
|
|
if (!hotfixCfg.ContainsKey(k))
|
|
{
|
|
hotfixCfg.Add(k, v);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
Hotfix.HotfixInject(injectAssmblyPath, xluaAssmblyPath, args.Skip(cfg_append == null ? 3 : 3), args[2], hotfixCfg);
|
|
}
|
|
catch(Exception e)
|
|
{
|
|
Console.WriteLine("Exception in hotfix inject: " + e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|