private MethodInfo FindMethod(string fullyQualifiedMethodName, object[] args)
var argTypes = new List<Type>();
for (var i = 0; i < args.Length; i++)
argTypes.Add(a.GetType());
TraceTools.TraceData(TracePrefix, "args[{0}]".FormatWith(i), a.ToString());
TraceTools.TraceData(TracePrefix, "args[{0}]".FormatWith(i), "null");
throw new NotSupportedException("'null' arguments are not supported for Script method invoking");
var hashKey = "{0}.{1}".FormatWith(fullyQualifiedMethodName, argTypes.JoinAsString());
if (hookMethodHash.ContainsKey(hashKey)) return hookMethodHash[hashKey];
var index = fullyQualifiedMethodName.LastIndexOf('.');
if (index < 0) return null;
var typeName = fullyQualifiedMethodName.Substring(0, index);
var methodName = fullyQualifiedMethodName.Substring(index);
var bf = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Static;
foreach (var module in assembly.GetModules())
foreach (var type in module.GetTypes().Where(x => x.FullName == typeName))
foreach (var member in type.GetMembers(bf).Where(x => x.Name == methodName))
var method = args == null || !args.Any()
? type.GetMethod(member.Name)
: type.GetMethod(member.Name, args.Select(x => x.GetType()).ToArray());
if (method == null) continue;
if (method.IsStatic) hookMethodHash.AddOrReplace(hashKey, method);