首页 > 编程语言 >C# 应用程序域

C# 应用程序域

时间:2023-03-14 23:13:20浏览次数:39  
标签:C# AppDomain 应用程序 newDomain CurrentDomain NET 执行

在.NET中,每个应用程序域都是一个独立的执行环境,有自己的安全边界和上下文。当使用AppDomain.ExecuteAssembly方法在一个新的应用程序域中执行一个程序集时,这个程序集将会在新的应用程序域中加载和执行,而与原应用程序域隔离开来,两个应用程序域之间的交互是受到限制的。

默认情况下,新应用程序域中的程序集无法访问原应用程序域中的对象和资源。如果需要在不同的应用程序域之间进行通信,需要使用.NET提供的跨应用程序域通信(Cross-AppDomain Communication)机制,例如MarshalByRefObject和AppDomain.UnhandledException事件等。

如果需要在新应用程序域中执行某些操作并将结果返回给原应用程序域,可以使用Remoting或WCF等技术。其中,Remoting提供了一种透明的远程调用机制,可以使得应用程序域之间的调用像本地调用一样简单;而WCF则提供了更加通用的跨进程和跨网络通信机制,可以支持多种协议和格式,具有更高的灵活性和扩展性。

总之,在.NET中,新的应用程序域与原应用程序域之间的交互需要通过特定的机制来实现,具体实现方式取决于具体的场景和需求.
在.NET中,被调用的目标程序集必须是可执行的,这是因为在.NET中,应用程序域的基本单元是可执行程序集(Assembly),而非单个类或对象。应用程序域是.NET提供的一种隔离机制,可以在同一个进程中加载和执行多个不同的可执行程序集,从而实现应用程序的模块化和隔离。

当在应用程序域中调用一个程序集时,CLR会将其加载到应用程序域中,并在其中创建一个或多个AppDomain对象。这个AppDomain对象将会在应用程序域的边界内隔离程序集的执行环境,保证程序集的运行不会对应用程序域之外的其他部分产生影响,从而提高应用程序的安全性和可靠性。

因此,为了能够在应用程序域中加载和执行一个程序集,这个程序集必须是可执行的,即符合.NET可执行程序集的规范,包含符号表、元数据和IL代码等信息。只有这样,CLR才能够正确地解析和执行这个程序集,并将其隔离在应用程序域内部的执行环境中,同时与其他程序集和应用程序域进行交互和通信。

总之,在.NET中,被调用的目标程序集必须是可执行的,才能够被加载到应用程序域中进行隔离和执行。
在.NET中,AppDomain类提供了一个DoCallBack方法,可以在当前应用程序域中调用指定委托(Delegate)的方法,并将其委托到另一个应用程序域中执行。这个方法通常用于实现应用程序域之间的通信和协作,可以在不同的应用程序域之间传递数据和执行代码,从而实现应用程序的分布式和模块化。

public void DoCallBack(CrossAppDomainDelegate callBackDelegate);

其中,callBackDelegate参数是一个CrossAppDomainDelegate委托,表示要在另一个应用程序域中执行的方法。该委托的参数和返回值必须是序列化和可传递的类型,否则将无法在应用程序域之间进行传递。
使用DoCallBack方法在新应用程序域中执行一个委托。这个委托输出了当前应用程序域的名称,并通过AppDomain.SetData方法将数据传递回主应用程序域。需要注意的是,在使用DoCallBack方法时,委托中的代码将会在另一个应用程序域中执行,因此需要考虑到数据和代码的传递和隔离问题。同时,由于跨应用程序域调用涉及到数据序列化和传输,因此可能会对性能和可靠性产生一定的影响。

AppDomain newDomain = AppDomain.CreateDomain("JohnYang New Domain");
            
            Console.WriteLine(AppDomain.CurrentDomain.FriendlyName+","+AppDomain.CurrentDomain.IsDefaultAppDomain());
            newDomain.SetData("Data", "Hello in new Domain");//在新应用程序域中设置槽
            newDomain.DoCallBack(() =>
            {
                //这些代码在newDomain中执行
                Console.WriteLine($"this is in {AppDomain.CurrentDomain.FriendlyName},{AppDomain.CurrentDomain.IsDefaultAppDomain()}");
                
                var data = AppDomain.CurrentDomain.GetData("Data");//newDomain自身设置Data
                Console.WriteLine($"new domain get data:{data}");//newDomain自身获取Data
            });
            //主程序域获取不到该项
            Console.WriteLine($"{AppDomain.CurrentDomain.FriendlyName}获取"+AppDomain.CurrentDomain.GetData("Data"));
            AppDomain.Unload(newDomain);
            Console.ReadLine();

output:

Learn.exe,True
this is in JohnYang New Domain,False
new domain get data:Hello in new Domain
EasyBimBackend.exe获取

标签:C#,AppDomain,应用程序,newDomain,CurrentDomain,NET,执行
From: https://www.cnblogs.com/johnyang/p/17216799.html

相关文章

  • C网络库mongoose
     官方链接:https://github.com/cesanta/mongoose[C++]-网络库mongoose简介_alwaysrun的博客-CSDN博客_c++mongooseMongoose-基于C的Web服务器介绍和使用-百度文库......
  • Dynamics 365 Reporting Services 报表日志目录
     默认目录为 <drive>\ProgramFiles\MicrosoftSQLServer\MSRS130.MSSQLSERVER\ReportingServices\LogFiles。  排查ReportingServices报表问题:https://lea......
  • cpp redifinition issues resolved by add macro #pragma once
    1.Without#pragmaonce  2.Whencomplement#pragmaonce,compileworked ......
  • tcp网络编程实例1
    tcp_server.c#include<signal.h>#include<stdio.h>#include<errno.h>#include<unistd.h>#include<stdlib.h>#include<time.h>#include<string.h>#include......
  • spring-security-02
    HTTP请求响应结构1.HTTP请求除了RequestBody,其他都是纯文本的格式请求GEThttp://localhost:8080/api/greetingHTTP/1.1响应HTTP/1.1401Set-Cookie:JSESS......
  • 《consul 简易上手指南》
    consul是一个用来做服务发现的框架,具有分布式、高可用以及可横向扩展的特性 什么是服务发现?为什么要实现服务发现?举个常见的例子: 假设有一台client想要实现不同......
  • qemu-kvm-ev-2.12.0-44.1.el7_8.1 线上热迁移qemu-kvm coredump问题分析
    配置libvirtcoredumo后(https://www.cnblogs.com/maojun1998/p/17215214.html)让测试一直迁移vm,一段时间后出现coredumproot错误码:coredump.sh严重错误,进程coredum......
  • 一个轻量级简单易用的c++请求库
    Sion是一个轻量级简单易用的c++请求库仅单个头文件,自带std::string的扩展跨平台,支持linux,win,mac...有着良好的异步支持,可以选择以自己喜欢的方式发送异步请求,cal......
  • IntelIJ IDEA配置Tomcat详解,遇到问题Error during artifact deployment. See server l
    查了一圈,最后发现自己在artifcat中加了太多了   将之前那些全部删掉,然后重新建一个项目,添加tomcat服务器,就可以正常运行了 ......
  • 【LeetCode贪心#03】最大子序和
    最大子序和力扣题目链接给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例1:输......