C# 如何将程序集加载到内存中并执行它

C# 如何将程序集加载到内存中并执行它,c#,winforms,reflection,C#,Winforms,Reflection,这就是我所做的: byte[] bytes = File.ReadAllBytes(@Application.StartupPath+"/UpdateMainProgaramApp.exe"); Assembly assembly = Assembly.Load(bytes); // load the assemly //Assembly assembly = Assembly.LoadFrom(AssemblyName); // Walk through each type in the

这就是我所做的:

byte[] bytes = File.ReadAllBytes(@Application.StartupPath+"/UpdateMainProgaramApp.exe");
Assembly assembly = Assembly.Load(bytes);
// load the assemly

//Assembly assembly = Assembly.LoadFrom(AssemblyName);

// Walk through each type in the assembly looking for our class
MethodInfo method = assembly.EntryPoint;
if (method != null)
{
    // create an istance of the Startup form Main method
    object o = assembly.CreateInstance(method.Name);
    // invoke the application starting point
    try
    {
        method.Invoke(o, null);
    }
    catch (TargetInvocationException e)
    {
        Console.WriteLine(e.ToString());
    }
}
问题是它抛出了
TargetInvocationException
——它发现方法是main,但它抛出了这个异常,因为在这一行:

object o = assembly.CreateInstance(method.Name);
o
保持为空。所以我在stacktrace中挖了一点,实际的错误是:

InnerException={“SetCompatibleTextRenderingDefault应在程序“}中创建firstfirst IWin32Window对象之前调用(这是我的翻译,因为它以半希伯来语半英语为我提供stacktrace,因为我的windows是希伯来语。)


我做错了什么?

如果您检查任何WinForm application Program.cs文件,您将始终看到这两行

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);

您还需要在程序集中调用它们。至少您的异常是这样说的。

在它自己的方法中调用它如何?

入口点方法是静态的,因此应该使用“实例”参数的空值来调用它。试着在组装后更换所有部件。使用以下部件加载线:

assembly.EntryPoint.Invoke(null, new object[0]);

如果入口点方法不是公共的,那么应该使用Invoke重载,该重载允许您指定
BindingFlags

@Eugen如何执行此操作?我正在调用应该激活此行的main方法,不是吗?您有权访问程序集的源代码吗?如果是,那么在一个方法内部创建,说“Init”,并将两行放在其中,然后在调用Main方法之前调用Init。如果你没有源代码,那么我需要做一件事:)顺便说一句,你没有告诉任何关于你的应用程序。它是什么?如果在从程序集中调用Main方法之前在应用程序中调用这些行,也会有所帮助。@Eugen我有源代码,我创建了这个init。现在我尝试这样做:
code
objectoo=assembly.CreateInstance(“Init”)
code
但是对象“oo”保持为空为什么?您不能在方法上调用CreateInstance。您需要调用该方法。请参阅本文中的示例,我需要将其加载到内存中,因为我以后需要删除其中的dll。。。所以这没有帮助。但是调用另一个进程也会导致它被加载到内存中。我不认为您可以删除一个已加载的dll,它包含的进程仍在运行。另请参见:@surfen确切地说-您看到的-第一个答案是:如果您将应用程序加载到内存中,那么程序集是不相关的-因此您可以删除它我看到。。。很好的技巧:)但是你正在加载exe,所以如果exe引用了另一个dll,那么dll程序集将被关联和阻止,不是吗?我不确定,但我正在尝试找出:)