问题标签 [appdomain]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 将 DLL 加载到单独的 AppDomain
我想动态加载一个或多个 DLL,以便它们以与我的主应用程序不同的安全性或基本路径运行。如何将这些 DLL 加载到单独的 AppDomain 并从中实例化对象?
.net - 使用 AppDomain 的好例子
我在面试中不断被问到关于 AppDomains 的问题,我知道基础知识:
- 它们是应用程序中的隔离级别(使它们与应用程序不同)
- 他们可以有线程(使它们与线程不同)
- 一个 appdomain 中的异常不会影响另一个
- appdomains不能访问彼此的内存
- 每个 appdomain 可以有不同的安全性
我仍然不明白是什么让它们变得必要。我正在寻找一个合理的具体情况,当你会使用一个。
答案:
- 不受信任的代码
- 受核心应用程序保护
的不受信任/第 3 方插件通过隔离在具有安全限制的单独应用程序域中来防止损坏共享内存和对注册表或硬盘驱动器的非授权访问,从而保护应用程序或服务器。例如 ASP.NET 和 SQL Server 托管组件代码 - 可信代码
- 稳定性
应用程序细分为安全、独立的特性/功能 - 架构灵活性
在单个 CLR 实例或每个程序中运行多个应用程序的自由。
还要别的吗?
c# - 如何从主 AppDomain 卸载程序集?
我想知道如何卸载加载到主 AppDomain 中的程序集。
我有以下代码:
完成后,我需要/希望能够卸载此程序集。
谢谢你的帮助。
c# - AppDomain 和当前目录
我有一个使用 Environment.CurrentDirectory 的目录交换方法的类。代码看起来像这样:
与我之前的文章一样,我们使用此目录切换方法来允许加载指定的程序集以及任何引用程序集以及非托管程序集。我遇到的问题是这个函数在两个单独的 AppDomain 中运行。在 AppDomain A(我创建的 AppDomain)中,代码工作正常。在 AppDomain B(默认 AppDomain)中,它会抛出 FileNotFoundException。对于这两个调用,我都试图加载相同的程序集。任何线索为什么会这样?
.net - 运行时可调用包装器 (RCW) 范围 - 进程或应用程序域?
引用非托管 COM 对象时,运行时可调用包装器 (RCW) 的范围是什么?根据文档:
运行时为每个 COM 对象只创建一个 RCW,无论该对象上存在多少引用。
如果我不得不“猜测”——这个解释应该是“每个进程一个”,但真的是这样吗?任何额外的文档都将非常受欢迎。
我的应用程序在它自己的应用程序域中运行(它是 Outlook 插件),我想知道如果我在循环中使用 Marshal.ReleaseComObject(x) 直到它的计数达到 0(如推荐的那样)会发生什么。它会释放来自其他插件的引用(在同一 Outlook 进程中的其他应用程序域中运行)吗?
编辑:完美 - 现在混乱更大了。基于 2 个答案(来自 Lette 和 Ilya),我们有 2 个不同的答案。官方MSDN 文档说每个进程(对于版本 2.0+),但是对于版本来说它缺少这句话。1.1 的文档。
同时,在 Mason Bendixen 的文章中,它说它是 per appdomain。
由于他的文章很旧(2007 年 4 月),我已经给他发了一封电子邮件,要求澄清,但如果其他人必须添加一些东西,请做。
谢谢
c# - 如何获取我的应用程序创建的应用程序域列表?
我有一个服务应用程序,它在用于长时间运行的任务的过程中创建 AppDomain。我一直在通过将它们存储在具有唯一 ID 的哈希表中来跟踪它们。
任务完成后,服务应用程序会卸载分配给该任务的 AppDomain,然后将其从 appdomain 哈希表中删除。
纯粹从完整性检查的角度来看,有没有一种方法可以查询 CLR 以查看创建应用程序域仍加载哪些应用程序域(即,我可以将跟踪 Hashtable 与 CLR 实际看到的内容进行比较)?
c# - AppDomain.CurrentDomain.BaseDirectory 和 Application.ExecutablePath 在实践中有什么区别?
根据 MSDN,BaseDirectory 是 AppDomain 查找要加载的 DLL 的地方,而 ExecutablePath 将提供原始可执行文件的路径(包括文件名)。我知道一个有文件名,另一个没有。我知道如果我创建一个新的 AppDomain,我可以给它一条不同的路径。但是从 ExecutablePath 中删除文件名并假设我只使用一个 AppDomain,实际上,这两个路径之间有什么区别?它们是否总是相同的(再次假设只有一个 AppDomain)?有没有一个例子它们会有所不同?
mono - 在 C# 中执行然后删除 DLL
我正在创建一个自我更新的应用程序,其中大部分代码都在一个单独的 DLL 中。它是命令行,最终将在 Mono 上运行。我只是想让这段代码在命令行的 Windows 上的 C# 中工作。
如何创建 ac# 应用程序,以便在运行时删除支持的 dll?
在 ReadLine,VersionUpdater.Core.dll 仍被锁定,无法删除
ICommand 接口位于 VersionUpdater.Common.dll 中,命令行应用程序和 VersionUpdater.Core.dll 都引用了该接口
c# - 我可以从 C# 在远程应用程序域中注入线程吗
我想知道是否可以将线程注入到在单独进程中运行的远程应用程序域中。
我的猜测是我可以使用调试接口(ICorDebug)来做到这一点,但我想知道是否还有其他方法?
c# - 如何强制 MSTEST TestMethod 在运行前重置所有单例/静态?
我在 Visual Studio 2008 中使用 MSTEST。如何让某个测试类中的每个单元测试方法都像运行的第一个测试一样,以便在运行每个测试之前重置所有全局状态?我不想使用 TestInitialize、ClassInitialize、AssemblyInitialize 等显式清理世界。例如:
尽管在该主题上出现了类似的问题,但它只是澄清了测试不是并行运行的。我意识到测试是连续运行的,但似乎没有办法为每个方法显式强制一个新的 AppDomain (或等同于清除所有状态的东西)。
理想情况下,我只想为我的单元测试的一小部分指定这种行为,这样我就不必为不关心全局状态的测试(绝大多数我的测试)。