问题标签 [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.

0 投票
2 回答
1591 浏览

c# - Type.IsSubclassOf() 不能跨 AppDomains 工作?

我在使用以下代码时遇到了一些问题:

该代码是通过我通过自定义应用程序域的 CreateInstanceFromAndUnwrap() 创建的代理调用的。这意味着 IsPluginAssembly() 在我的自定义应用程序域的上下文中执行。

问题是对 IsSubclassOf() 的调用总是返回 false,即使恕我直言它应该返回 true。有问题的“类型”确实继承自 ClientPlugin - 毫无疑问。

ClientPlugin 是在另一个私有程序集中定义的,我正在手动解析它,如上面的代码片段所示。

if (type.IsSubclassOf(...))在行上放了一个断点并确认这个表达式是错误的:

另一方面,这个表达式是真的:

这怎么可能?这是怎么回事?

更新:Kent Boogaart 为我指明了正确的方向。我在网上搜索了更多,然后遇到了这篇博文。看来我必须解决我的 Load/LoadFrom/ReflectionOnlyLoadFrom 冲突才能完成这项工作。

0 投票
2 回答
1981 浏览

vb.net - 在 appdomain 中执行功能

给定一个 .NET DLL,它由一个类“Place”和一个返回整数的函数“Where”组成;我需要将 dll 加载到应用程序域中,执行函数并卸载应用程序域。

此行失败:

使用此错误消息:

该文件在缓冲区中,所以我猜它是一个依赖.dll。但是,它应该在基本程序目录中找到那些。

关于错误原因的任何想法?

任何用于将程序集加载到 AppDomain、执行函数、然后卸载 AppDomain 的测试示例代码将不胜感激。

(顺便说一句,我用谷歌搜索并没有找到任何有用的样本。)

0 投票
3 回答
84210 浏览

c# - 什么是应用域?

什么是AppDomain?AppDomains 的好处是什么,或者为什么微软提出了 AppDomains 的概念,没有 AppDomains 的问题是什么?

请详细说明。

0 投票
2 回答
3411 浏览

wpf - 在一个 UI 线程上跨多个 AppDomain 运行 WPF 有什么问题?

我们正在考虑创建一个跨多个 AppDomain 运行的 WPF UI。其中一个应用程序域将运行应用程序,而其余的 AppDomains 将托管一系列用户控件和逻辑。当然,这个想法是将这些用户控件和逻辑从主应用程序中分离出来。

是使用 MAF/System.AddIn 执行此操作的示例。其他人在这方面有什么经验?此解决方案如何处理可能发生在一个用户控件内的 RoutedEvents/Commands,以及这些是否在 AppDomains 中正确序列化?WPF 资源呢?可以跨 AppDomain 无缝访问它们吗?

0 投票
4 回答
7214 浏览

c# - 使用 MarshalByRefObject 的 [Serializable] 属性或子类?

我想跨 AppDomains 使用一个对象。

为此,我可以使用 [Serializeable] 属性:

或 MarshalByRefObject 的子类:

在这两种情况下,我都可以像这样使用该类:

为什么这两种方法似乎具有相同的效果?两种方法有什么区别?我什么时候应该偏爱一种方法而不是另一种方法?

编辑:表面上我知道两种机制之间存在差异,但是如果有人从灌木丛中跳出来问我这个问题,我无法给他正确的答案。这些问题是相当开放的问题。我希望有人能比我做得更好。

0 投票
3 回答
23932 浏览

.net - 我不了解应用程序域

.NET 具有应用程序域的概念,据我了解,它可用于将程序集加载到内存中。我已经对应用程序域进行了一些研究,并去我当地的书店了解了关于这个主题的一些额外知识,但它似乎非常稀缺。

我所知道的我可以对应用程序域做的就是在内存中加载程序集,我可以在需要时卸载它们。

我提到的应用程序域的其他功能是什么?线程是否尊重应用程序域边界?除了通信性能之外,在主要应用程序域之外的不同应用程序域中加载程序集是否有任何缺点?

链接到讨论应用程序域的资源也很好。我已经查看了 MSDN,它没有太多关于它们的信息。

0 投票
2 回答
516 浏览

c# - 通过 NUnit 运行 C++ 代码

我尝试使用 NUnit 来测试已经连接到 C++ 代码的 C# 代码(没有 NUnit,应用程序可以完美运行)。

在我的测试中,我通过 AppDomain.CurrentDomain.ExecuteAssembly(..) 运行 main 函数,但是当 C# 代码尝试与 C++“通信”时,它会引发异常并且测试崩溃。例外是 System.Reflection.TargetInvocationException 如果有人知道为什么会发生它,那将非常有帮助......谢谢,Naama

0 投票
2 回答
227 浏览

c# - 反射与应用设计

让我描述一下我目前拥有的问题和解决方案,也许您可​​以帮助我了解为什么这是一个坏主意(假设是)以及我可以做些什么来使它成为一个更好的系统。

现在我有 600 个“开膛手”来解析文件并将它们撕成 csv 或其他格式。裂土器都实现了一个通用接口和基类。当作业根据该作业的配置排队时,使用反射调用特定的 ripper。

所有开膛手都实现了一个名为“Rip()”的函数,接口将它们收缩到该函数。

使用当前代码,我能看到的唯一问题是在加载 600 个程序集后(因为它们是在需要时加载的),如果它们在使用后没有被卸载,它会开始变得有点慢。

你有什么建议?

0 投票
2 回答
1186 浏览

c# - 隔离存储,试图展示不同的隔离级别——不能用于域隔离

我已对其进行了编辑和修剪以尝试将其关闭,因为该站点提示我接受答案或添加赏金。

我做了一个实验,在控制台应用程序引用的库中调用了 GetUserStoreForAssembly 和 GetUserStoreForDomain,但我不明白为什么在一种情况下我获得的商店比我预期的要多,而在另一种情况下却少。

Preet 帮助我调整了我的实验,最终我遇到了两个略有不同的问题:

  • 当我将控制台应用程序复制到另一个目录时(因此名称保持不变),我得到了两个用户/程序集存储,即每个副本一个,当我希望它们共享时

  • 当我将我的库加载到控制台应用程序中的多个域时,当我希望它们不共享时,它们仍然使用相同的用户/程序集/域存储

到那时,这个问题已经很冷了。我做了自己的阅读,我想我找到了答案,所以我自己回答了这个问题,希望有人能确认/纠正。但它在名单上的位置太低了,没有机会。我正要离开它,但后来被提示接受或添加赏金。

所以我把我的答案移到了这里,现在只需要有人添加一些有用的评论来确认或纠正,这样我就可以接受它并知道这实际上对任何想要更好地理解隔离存储的人有用:

第一个问题的可能答案:

强命名程序集当然由它们的强名称来标识。弱命名(不确定这是否是官方术语,但无论如何)由它们的 URL 或文件位置标识。因此,复制到不同目录的同一个弱命名程序集将拥有自己独立的独立存储。

第二个问题的可能答案答案(对此不太确定):

GetUserStoreForDomain 返回的范围仅限于机器、用户、应用程序和程序集,特别是在特定应用程序中运行的程序集。

我的实验创建了多个额外的域,但它们都在同一个应用程序中。因此,它们都使用同一个域存储。

因此,为了模拟域隔离,我实际上需要从两个不同的控制台应用程序中引用该库。

只有当库(以及因此两个控制台应用程序)是强命名时,这才会正常工作。引用一个程序集会导致它被复制,这意味着如果它被弱命名,它将有一个单独的隔离存储。

我刚刚用强命名尝试了整个实验,我现在得到了 2 个域存储和 1 个装配存储,如预期的那样。

0 投票
8 回答
143125 浏览

c# - 如何使用所有引用递归地将程序集加载到 AppDomain?

我想加载一个AppDomain具有复杂引用树的新程序集(MyDll.dll -> Microsoft.Office.Interop.Excel.dll -> Microsoft.Vbe.Interop.dll -> Office.dll -> stdole.dll)

据我了解,当一个程序集被加载到时AppDomain,它的引用不会自动加载,我必须手动加载它们。所以当我这样做时:

并得到FileNotFoundException

无法加载文件或程序集“MyDll,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。

我认为关键部分是它的依赖项之一

好的,我下一个domain.Load(AssemblyName.GetAssemblyName(path));

但是FileNotFoundException又在另一个(引用的)程序集上得到了。

如何递归加载所有引用?

在加载根程序集之前是否必须创建引用树?如何在不加载程序集的情况下获取程序集的引用?