C# 你为什么不工作?
我真想知道为什么汇编解析器不工作?我也不能用 foreach(解压缩二进制文件中的字节[]二进制文件)C# 你为什么不工作?,c#,.net,plugins,appdomain,C#,.net,Plugins,Appdomain,我真想知道为什么汇编解析器不工作?我也不能用 foreach(解压缩二进制文件中的字节[]二进制文件) ApplicationHost.Load(二进制); 如何解决?请看我的参考问题:http://stackoverflow.com/questions/9721686/how-to-use-appdomain-createdomain-with-assemblyresolve protected void LoadApplication() { AppDo
ApplicationHost.Load(二进制); 如何解决?请看我的参考问题:http://stackoverflow.com/questions/9721686/how-to-use-appdomain-createdomain-with-assemblyresolve
protected void LoadApplication()
{
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
domainSetup.DisallowBindingRedirects = false;
domainSetup.DisallowCodeDownload = true;
domainSetup.LoaderOptimization = LoaderOptimization.SingleDomain;
//domainSetup.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
ApplicationHost = AppDomain.CreateDomain("Test.Service", null, domainSetup);
object obj = ApplicationHost.CreateInstanceAndUnwrap("Test.Process", "Test.ApplicationLoader");
Assembly objExecutingAssemblies = Assembly.GetExecutingAssembly();
AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();
foreach (AssemblyName assName in arrReferencedAssmbNames)
{
ApplicationHost.Load(assName);
}
ApplicationHost.AssemblyResolve += new ResolveEventHandler(OnAssemblyResolve);
List<byte[]> deCompressBinaries = new List<byte[]>();
foreach (var item in AppPackage.Item.AssemblyPackage)
deCompressBinaries.Add(item.Buffer);
var decompressvalues = DeCompress(deCompressBinaries);
deCompressBinaries.Clear();
deCompressBinaries = decompressvalues.ToList();
foreach (byte[] binary in deCompressBinaries)
ApplicationHost.Load(binary);
Assembly[] assAfter = AppDomain.CurrentDomain.GetAssemblies();
}
Assembly OnAssemblyResolve(object sender, ResolveEventArgs args)
{
return Assembly.Load(args.Name);
}
受保护的void LoadApplication()
{
AppDomainSetup domainSetup=新建AppDomainSetup();
domainSetup.ApplicationBase=AppDomain.CurrentDomain.BaseDirectory;
domainSetup.DisallowBindingRedirects=false;
domainSetup.DisallowCodeDownload=true;
domainSetup.LoaderOptimization=LoaderOptimization.SingleDomain;
//domainSetup.ConfigurationFile=AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
ApplicationHost=AppDomain.CreateDomain(“Test.Service”,null,domainSetup);
object obj=ApplicationHost.CreateInstanceAndUnwrap(“Test.Process”、“Test.ApplicationLoader”);
Assembly objExecutingAssemblies=Assembly.getExecutingGassembly();
AssemblyName[]arrReferencedAssmbNames=ObjExecutingAssemblys.GetReferencedAssemblys();
foreach(arrReferencedAssmbNames中的AssemblyName assName)
{
ApplicationHost.Load(assName);
}
ApplicationHost.AssemblyResolve+=新的ResolveEventHandler(OnAssemblyResolve);
List deCompressBinaries=新列表();
foreach(AppPackage.item.AssemblyPackage中的变量项)
解压缩二进制文件。添加(item.Buffer);
var decompressvalues=解压缩(解压缩二进制文件);
解压缩二进制文件;
deCompressBinaries=decompressvalues.ToList();
foreach(解压缩二进制文件中的字节[]二进制)
ApplicationHost.Load(二进制);
程序集[]assAfter=AppDomain.CurrentDomain.getAssemblys();
}
AssemblyResolve上的程序集(对象发送方、ResolveEventArgs args args)
{
返回Assembly.Load(args.Name);
}
由于以下原因之一,CLR的AssemblyResolve fill fire only未能加载程序集。此事件不会仅因为从字节数组加载程序集而触发
这里有一些例子
- 此代码将触发AssemblyResolve事件,因为“System.Drawing”作为程序集名称是不够的
object obj2 = ApplicationHost.CreateInstanceAndUnwrap("System.Drawing", "System.Drawing.Rectangle");
- 此代码不会激发AssemblyResolve事件,因为“System.Drawing,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”是完全限定的程序集名称
object obj2 = ApplicationHost.CreateInstanceAndUnwrap("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Rectangle");
AssemblyResolve
,因为您正在加载LoadApplication
方法中的所有程序集-AssemblyResolve
仅在无法解析所需的程序集引用时才会调用
我建议你跑步,这样你就可以想象发生了什么
如果要根据需要加载程序集,则代码块:
List<byte[]> deCompressBinaries = new List<byte[]>();
foreach (var item in AppPackage.Item.AssemblyPackage)
deCompressBinaries.Add(item.Buffer);
var decompressvalues = DeCompress(deCompressBinaries);
deCompressBinaries.Clear();
deCompressBinaries = decompressvalues.ToList();
foreach (byte[] binary in deCompressBinaries)
ApplicationHost.Load(binary);
Assembly[] assAfter = AppDomain.CurrentDomain.GetAssemblies();
List deCompressBinaries=newlist();
foreach(AppPackage.item.AssemblyPackage中的变量项)
解压缩二进制文件。添加(item.Buffer);
var decompressvalues=解压缩(解压缩二进制文件);
解压缩二进制文件;
deCompressBinaries=decompressvalues.ToList();
foreach(解压缩二进制文件中的字节[]二进制)
ApplicationHost.Load(二进制);
程序集[]assAfter=AppDomain.CurrentDomain.getAssemblys();
将需要在AssemblyResolve
中工作。块当前将所有内容加载到AppDomain中,因此您必须重新编写该逻辑
当然,你可能还想做的另一件事是不要重新发明轮子,而是使用它。可能的复制品