C# 在AppDomain中加载程序集并调用入口点
这件事让我很难受。我在谷歌上搜索了好几个小时,在这里遇到了很多不同的问题,但我就是找不到C# 在AppDomain中加载程序集并调用入口点,c#,.net,appdomain,assembly.load,C#,.net,Appdomain,Assembly.load,这件事让我很难受。我在谷歌上搜索了好几个小时,在这里遇到了很多不同的问题,但我就是找不到 static void Main(string[] args) { AppDomainSetup domainSetup = new AppDomainSetup { PrivateBinPath = typeof(Program).Assembly.Location }; AppDomain domain = AppDomain.CreateDomain("TempDomain", nul
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.ExecutionEngineeException”的未处理异常
我之前和某人谈过,他们让它与这个特定的程序集一起工作,所以它一定是可能的。我想你需要它在VB.NET中,自己看看如何将它包装到c#中
在.Net世界中,没有DLL Main方法可以在程序集加载到应用程序域时调用。Net支持模块初始值设定项。模块初始值设定项是全局函数,C#不支持全局函数,因此无法使用C#语言定义和使用模块初始值设定项。CLR支持模块初始值设定项,IL代码(操作码)可用于写入模块初始值设定项
有关更多信息,请参阅以下链接:@devundef-无内部源(以前从未真正使用过调用堆栈,因此不确定这意味着什么/如果相关)。外部来源:mscorlib.dll!System.Threading.ThreadHelper.ThreadStart(对象obj)已合并!ﱈ㑸购ᷚ븋䕒.㶯맖ꅰ㟏幔款彶(对象线程)mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_上下文(对象状态):::mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback callback,object state::[Appdomain Transition]@Banski,堆栈跟踪通常是相关的,因为它们提供了有关哪个方法引发了异常的信息。@devundef,我通常通过其他方法(或至少尝试)来发现并修复我的问题,但我会记住这一点。关于这个问题,你有什么想法吗?你有没有试着用这个组件做些别的事情?e、 g.从mfX3DAu程序集创建某个类型的实例,并对该类型调用某个方法。这将确认入口点是否存在问题。你好,贝吉,欢迎来到StackOverflow。虽然这似乎是一个正确的答案,但如果你用提问者需要的语言(C#)提供答案,那将更有价值。此外,简短的描述也很有帮助,这样可以为将来阅读您答案的人提供更多的价值,并为您提供更多的支持。您可以输入任何必要的命令行参数,如:“first”、“second”、“3”,而不是“1”
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