0

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

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

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

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

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

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

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

第一个问题的可能答案:

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

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

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

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

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

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

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

4

2 回答 2

2

您可以在单个程序/进程中创建多个应用程序域。在 appdomain 内,您可以加载程序集。调用每个应用程序域/程序集中的方法

这里有例子(appdomains)这里(AssemblyIdentity)这里

于 2009-03-17T22:05:34.847 回答
0

您可以在单个程序/进程中创建多个应用程序域。在 appdomain 内,您可以加载程序集。调用每个应用程序域/程序集中的方法

这里有例子

于 2009-03-17T22:10:06.897 回答