所以我有一个带有函数(静态或实例,我可以更改它,并且仍然可以工作)的 .dll,并且我想创建一个以 Main 作为入口点的 Exe,它读取命令行,并从 . dll
这是我试图调用的方法
public static void Add(String a, String b)
{
Console.WriteLine( "{0} + {1}= {2}", a, b , a+b);
}
- 所以我加载 dll 程序集,并获取具有我想要的功能的类型
Assembly asmLoaded = Assembly.LoadFrom(nameDLL);
Type baseType = asmLoaded.GetType(typeName);
- 为新的 Exe 创建新的程序集、模块和类型
AssemblyName aName = new AssemblyName("AppAsm");
AssemblyBuilder ab =
AppDomain.CurrentDomain.DefineDynamicAssembly(
aName,
AssemblyBuilderAccess.Save);
ModuleBuilder mb =
ab.DefineDynamicModule("AppMod", typeName + methodName + ".exe");
TypeBuilder tb = mb.DefineType("AppType", TypeAttributes.Public);
- 从我要调用的方法中获取methodInfo,以及后面的Emit(Opcodes.Call,..)的参数Types[];
-然后我将方法“Main”定义为入口点
MethodBuilder metb = tb.DefineMethod("Main", MethodAttributes.Public |
MethodAttributes.Static, null, new Type[] { typeof(String[])});
ab.SetEntryPoint(metb);
-通过使用 ildasm,我尝试做这部分,生成 IL
ILGenerator il = metb.GetILGenerator();
for (int i = 0; i <paramTypes.Length; ++i)
{
il.Emit(OpCodes.Ldarg_0); // get the String[], in 0 cause its static
il.Emit(OpCodes.Ldc_I4,i);
il.Emit(OpCodes.Ldelem_Ref);
il.Emit(OpCodes.Stloc, i);
}
il.Emit(OpCodes.Ldloc, 0);
il.Emit(OpCodes.Ldloc, 1);
il.EmitCall(OpCodes.Call, wantedMethodInfo, paramTypes);
il.Emit(OpCodes.Ret);
- 最后我创建了类型,并保存了 assemblyBuilder
tb.CreateType();
ab.Save(typeName + methodName + ".exe");
当然它不起作用,xD 当我运行使用某些值生成的 exe 时,它会抛出 System.InvalidProgramException: Common Languafe Runtime detected an invalid program。在 AppTYpe.Main(String[] ) 中 ,我想我可能应该弹出一些东西,但不确定。