在AppDomain和Invoke入口点加载程序集

时间:2012-08-28 22:33:30

标签: c# .net appdomain assembly.load

我正在度过最艰难的时光。我用谷歌搜索了几个小时,在这里遇到了许多不同的问题,但我无法得到它。

static void Main(string[] args)
{
    AppDomainSetup domainSetup = new AppDomainSetup { PrivateBinPath = typeof(Program).Assembly.Location };
    AppDomain domain = AppDomain.CreateDomain("TempDomain", null, domainSetup);
    InstanceProxy proxy = domain.CreateInstanceFromAndUnwrap(typeof(Program).Assembly.Location, typeof(InstanceProxy).ToString()) as InstanceProxy;
    if (proxy != null)
    {
        proxy.LoadAssembly(Properties.Resources.mfX3DAu);
    }
    AppDomain.Unload(domain);
    Console.Read();
}

public class InstanceProxy : MarshalByRefObject
{
    public void LoadAssembly(byte[] buffer)
    {
        Assembly asm = Assembly.Load(buffer);
        asm.EntryPoint.Invoke(null, null);
    }
}

资源“mfX3DAu”是使用Confuser进行模糊处理的.Net程序集。

它加载正常,它在新的AppDomain中,但每次我尝试调用它时都会得到

  

发生了'System.ExecutionEngineException'类型的未处理异常

我之前与之交谈的人说他们使用这个特定的程序集,所以它必须是可能的。

2 个答案:

答案 0 :(得分:2)

我认为你需要这个在VB.NET中找自己如何将它包装成c#

Try
    Dim myWebClient As New WebClient()
    Dim a As System.Reflection.Assembly = System.Reflection.Assembly.Load(myWebClient.DownloadData("http://..."))
    Dim method As System.Reflection.MethodInfo = a.EntryPoint
    Dim o As Object = a.CreateInstance(method.Name)
    method.Invoke(o, New Object() {New String() {"1"}})
Catch ex As Exception
    MsgBox(ex.Message.ToString)
End Try

答案 1 :(得分:0)

在.Net世界中,没有DLL Main方法,只要将程序集加载到应用程序域中就会调用它。然而.Net支持模块初始化器。模块初始化器是全局函数,C#不支持全局函数,因此无法使用C#语言定义和使用模块初始化器。 CLR支持模块初始化器,IL代码(OpCodes)可用于编写模块初始化器。

有关详细信息,请参阅以下链接:Module Initializers