C# AppDomain在C语言中的使用#

C# AppDomain在C语言中的使用#,c#,remoting,appdomain,C#,Remoting,Appdomain,AppDomains在C#中最重要的用途是什么?最重要的一个用途是你的代码必须有一个,即你用C#编写的所有东西都在AppDomain中执行。这是相当重要的-p 如果您是指其他应用程序域: 当使用插件和其他不受信任的代码时,它既允许隔离,也允许卸载它们(不能卸载程序集,只能卸载整个应用程序域) 我目前正在使用它来加载动态生成的DLL,以便卸载它们 它们还允许您设置不同的配置文件、信任级别等,但会带来相关的复杂性和远程处理成本 MSDN有一个关于应用程序域的部分,我不能告诉你什么是最重要的用途,因为

AppDomains在C#中最重要的用途是什么?

最重要的一个用途是你的代码必须有一个,即你用C#编写的所有东西都在
AppDomain
中执行。这是相当重要的-p

如果您是指其他应用程序域:

当使用插件和其他不受信任的代码时,它既允许隔离,也允许卸载它们(不能卸载程序集,只能卸载整个应用程序域)

我目前正在使用它来加载动态生成的DLL,以便卸载它们

它们还允许您设置不同的配置文件、信任级别等,但会带来相关的复杂性和远程处理成本


MSDN有一个关于应用程序域的部分,我不能告诉你什么是最重要的用途,因为这取决于具体情况

AppDomains对于应用程序的沙箱部分非常有用。您可以在AppDomain中加载扩展并再次卸载它们—这是您无法执行的。您可以为AppDomains分配特定的权限。不同AppDomain中的默认对象不能相互访问

AppDomains可以看作是轻量级进程,因为它们提供了许多相同的功能。但是,与进程不同,新的AppDomains没有默认的线程。您必须自己管理应用程序域和线程


此外,AppDomains都共享同一个托管堆。这通常不是问题,但可能会产生令人惊讶的效果,因为某些实例(如字符串)在AppDomains之间共享。对于常规使用,这不是问题,但如果使用字符串进行锁定,不同AppDomain中的线程可能会相互影响

一般来说,使用AppDomains并不是日常的编码实践,这可以看作是一个高级概念。。但是,从这个简单的事情开始,更好地理解“AppDomain”一词背后的概念是很重要的

就架构而言,尽可能简单地说,AppDomain是一个隔离容器,即使在内存寻址方面也是如此,在它内部,应用程序所需的所有程序集都会被加载和执行,即使这个概念更复杂,无法详细解释(我希望这不是关于你的问题,更深入)

从这里开始,AppDomain类首先用于获取对与应用程序相关的执行应用程序域的访问,这可以通过Singleton属性实现
AppDomain.CurrentDomain
完成。通过这种方式,可以:

  • 获取已加载组件的访问权限
  • 获取对appdomain共享数据插槽的访问权
  • intems编组,即从已创建域中加载的程序集中展开已创建实例
  • 然后,AppDomain类用于:

  • 在同一过程中创建更多的“域”
  • 在过程中执行程序集
  • 管理appdomain的加载/卸载过程
  • 查看新的Microsoft框架(尚未发布)的代码可能会很有用,该框架真正基于AppDomains创建和卸载、动态加载的程序集等概念

    作为一个简单的例子,以及你可以用AppDomains做什么的例子,我可以分享一下

    我希望我回答了你的问题。

    C#AppDomain是一个逻辑上隔离的容器,在其中运行.NET代码。当您运行任何.NET代码时,它总是在默认的appdomain中运行

    请务必观看这段30分钟的youtube视频,该视频将更详细地解释AppDomain

    但我还是要试着更详细地解释一下。假设您获得了第三方DLL,并且希望在应用程序中使用它。但您也怀疑第三方可能有一些恶意代码,因此希望在受约束的环境中运行第三方DLL。就像你不希望第三方访问你的c:驱动器或删除文件等


    因此,您可以创建两个AppDomain,一个用于第三方,另一个用于您自己的C#类。对于第三方appdomain,您将应用无法访问c:drive的安全约束,对于c#DLL,您将拥有一个不受限制的应用程序域

    请阅读我的博客,了解DLL运行时加载和使用AppDomain进行交叉通信的标准应用程序

  • DLL的运行时加载和卸载:我参与了一个项目,用户在运行时加载DLL,在程序执行期间,使用反射执行方法,并在程序运行期间卸载方法
  • 保护我的主执行程序:我们正在动态加载DLL,因此动态加载的DLL中发生的任何异常都不会影响我的主AppDomain。在发生损坏的情况下,我们可以选择高效地卸载并再次加载DLL
  • 跨AppDomain通信:我们可以在运行时在不同AppDomain中动态加载任意两个DLL,并使它们相互通信

  • 关于字符串的注释很好。“AppDomain都共享同一个托管堆。”这是否意味着它们也共享静态类或静态方法?请阅读我的博客,了解DLL运行时加载和使用AppDomain进行交叉通信的标准应用程序。