C# GetType(“[…]”,true);抛出TypeLoadException
我的代码:C# GetType(“[…]”,true);抛出TypeLoadException,c#,C#,我的代码: //App, Core.cs using System; using System.IO; using System.Reflection; namespace Game { public static void Main(string[] args) { Assembly a = Assembly.LoadFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "mods\\ExampleM
//App, Core.cs
using System;
using System.IO;
using System.Reflection;
namespace Game
{
public static void Main(string[] args)
{
Assembly a = Assembly.LoadFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "mods\\ExampleMod.dll"));
var x1 = a.GetType("PTF_Mod.Mod_Main");
var x2 = x1.GetMethod("OnStart");
var x3 = x2.Invoke(null, new object[] { });
while(true);
}
}
//App, ModCrew.cs
using System;
using System.Reflection;
namespace Engine
{
public static class ModCrew
{
public class Mod
{
public void ItWorks()
{
Console.WriteLine("It works!");
}
}
}
}
//DLL, Mod_Main.cs
using System;
using System.Reflection;
namespace PTF_Mod
{
public static class Mod_Main
{
public static void OnStart()
{
var exe = Assembly.GetCallingAssembly();
Console.WriteLine(exe.Location); //Location is valid
var x = exe.GetType("Engine.ModCrew.Mod", true); //But here I get exception
var y = Activator.CreateInstance(x);
x.GetMethod("ItWorks", BindingFlags.Instance).Invoke(null, object[] { });
}
}
}
例外情况:
mscorlib.dll中发生“System.TypeLoadException”类型的异常,但未在用户代码中处理
附加信息:Nie można załadowaćtypu'Engine.ModCrew.Mod'z zestawu'游戏,版本=0.0.0.0,文化=中立,PublicKeyToken=null。通过反射获取方法时,您应该始终使用
绑定标志
使用MethodInfo.Invoke
调用实例需要将实例作为第一个参数MethodInfo.Invoke(MyInstance,…)
基于评论的更改:
public static void Main(string[] args)
{
Assembly a = Assembly.LoadFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "mods\\ExampleMod.dll"));
var x1 = a.GetType("PTF_Mod.Mod_Main");
var x2 = x1.GetMethod("OnStart", BindingFlags.Static | BindingFlags.Public);
var x3 = x2.Invoke(null, null);
while(true);
}
主要模块:
public static void OnStart()
{
var exe = Assembly.GetCallingAssembly();
Console.WriteLine(exe.Location); //Location is valid
var x = exe.GetType("Engine.ModCrew+Mod", true); //But here I get exception
var y = Activator.CreateInstance(x);
x.GetMethod("ItWorks", BindingFlags.Instance | BindingFlags.Public).Invoke(y, null);
}
还考虑如果反射是必要的,它会使程序过于复杂。如果有必要,您应该研究
Dynamic
,以避免使用反射调用方法的许多麻烦“Engine.ModCrew+Mod”
然后在Core.cs中的“var x3=x2.Invoke(null,new object[]{};”上键入LoadException“mscorlib.dll中发生'System.TypeLoadException'类型的异常,但用户代码中未处理该异常”哦,等等,在测试您的答案后,我忘记生成dll@TheChilliPLOnStart
不接受任何参数,而是执行x2.Invoke(null,null);