Simple: your methods are not static, they are instance methods: you need to create an instance of the object and pass that through, rather than trying to pass the type of the class, and you need to pass the argument through:
Assembly assembly = Assembly.LoadFrom(@"D:\TestDll.dll");
foreach (Type ti in assembly.GetTypes().Where(x => x.IsClass))
{
if (ti.Name == "Class2")
{
Type t = assembly.GetType("TestDll.Class2");
object obj = t.InvokeMember(null,
BindingFlags.DeclaredOnly |
BindingFlags.Public |
BindingFlags.NonPublic |
BindingFlags.Instance |
BindingFlags.CreateInstance,
null,
null,
null);
object res = t.InvokeMember("TestMethod2", BindingFlags.InvokeMethod, null, obj, new object[] { (object)13 });
}
}