Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 你为什么不工作?_C#_.net_Plugins_Appdomain - Fatal编程技术网

C# 你为什么不工作?

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

我真想知道为什么汇编解析器不工作?我也不能用

foreach(解压缩二进制文件中的字节[]二进制文件)
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中,因此您必须重新编写该逻辑

当然,你可能还想做的另一件事是不要重新发明轮子,而是使用它。

可能的复制品