制作域中立程序集的步骤是什么?

2024-05-04

...这些步骤也可以应用于第三方议会(可能已经是强名称的)吗?

我的问题的上下文应该不重要,但无论如何我都会分享:我正在考虑制作一个记录器(或日志包装器),它始终知道要定位的“日志源”,无论使用它的程序集是否是在一个应用程序域中,或分布在多个应用程序域中。我认为实现这一目标的一种方法是拥有一个具有静态“LogSource”属性的域中立程序集。如果在与域无关的程序集中设置该静态属性,我认为所有应用程序域都会看到它。


程序集没有以任何特定方式标记为领域中立。您不必给它们一些特定的属性来使它们与域无关。任何程序集都可以由 CLR 加载到共享域或触发程序集加载的域中,具体取决于 CLR 的配置CLR实例那就是加载程序集。

CLR 实例决定如何加载程序集由策略决定。有多种方法可以显式设置此策略:

  • set 加载器优化属性 http://msdn.microsoft.com/en-us/library/system.loaderoptimizationattribute.aspx在可执行文件的入口点(通常是 Main)。 CLR 加载程序将在启动可执行文件时应用指定的策略。
  • set the AppDomainSetup.Loader优化 http://msdn.microsoft.com/en-us/library/system.appdomainsetup.loaderoptimization.aspx从托管代码创建新的应用程序域时的属性。
  • CorBindToRuntimeEx http://msdn.microsoft.com/en-us/library/99sz37yh.aspx- 当从非托管代码启动 CLR 时,此函数允许您指定启动标志 http://msdn.microsoft.com/en-us/library/ms231027.aspx,其中一些控制加载器优化。

作为域中立加载的程序集将被加载到共享域中。应用域名是 CLRv4 中的“EE Shared Assembly Repository”。这不是真正的应用程序域,因为它没有数据并且无法运行任何代码。加载到其中的程序集将在所有其他正在运行的应用程序域之间共享其代码。程序集中的字节代码将仅进行一次 JIT 编译。然而,程序集中的所有可变数据都将在运行域之间复制。静态字段不在应用程序域之间共享。每个应用程序域的静态字段将被重复,并且当引用相同的静态字段时,不同的应用程序域将在内存中的不同位置读取和写入。

另外:还有另一种静态字段 - RVA 静态字段,它在当前进程中的所有应用程序域之间共享。无法在 C# 中声明这样的字段,但可以在 C++/CLI 中完成。

使用域中立程序集需要权衡。访问静态字段的速度较慢。由于它们仅进行一次 JIT 处理,但可以访问每个应用程序域静态字段的多个实例,因此对静态字段的任何访问都会经过额外的间接访问。当程序集直接加载到运行域中时,静态字段的地址可以直接嵌入到 JIT 代码中。但是,当编译到共享程序集中的代码尝试访问静态字段时,它必须首先加载当前域的上下文,然后在其中查找该域的静态字段地址。

决定是将程序集加载到共享域还是运行域取决于您的用例,更具体地说,您要创建多少个应用程序域以及要加载到其中的核心类型。

  • 如果加载运行本质上相同代码的多个域,您会希望尽可能多地共享程序集,除非它会严重损害访问静态字段的性能。一个示例是,为了隔离,应用程序决定在单独的应用程序域中运行自己的部分代码。
  • 如果您使用不同的代码加载多个域,则您只想共享所有不同程序集可能常用的程序集。这些通常是 .NET Framework 自己的程序集以及从 GAC 加载的所有程序集。运行 ASP.NET 应用程序时,IIS 默认以这种方式工作。
  • 如果您只使用一个应用程序域,则不应共享任何内容。常规的 GUI 应用程序就是这样。

注意:mscorlib 始终加载到共享域中。

来源和进一步阅读:

  • 应用程序域和程序集 http://msdn.microsoft.com/en-us/library/43wc4hhs.aspx
  • 领域中立的程序集 http://blogs.msdn.com/b/junfeng/archive/2004/08/05/208375.aspx
  • Essential .NET,第 1 卷,Addison Wesley http://www.amazon.ca/Essential-NET-Volume-Language-Runtime/dp/0201734117;第 8 章“AppDomains 和代码管理”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

制作域中立程序集的步骤是什么? 的相关文章

  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 什么可以解释托管堆上超过 5,000,000 个 System.WeakReference 实例?

    我一直在针对生产 ASP NET Web 应用程序运行负载测试 并且看到在堆上创建了大量 System WeakReference 在大约 15 分钟内 负载管理堆内存已飙升至大约 3GB 并且我有大约 5 000 000 个对 Syste
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 有没有办法禁用 .NET 标签的“双击复制”功能?

    这真的很烦人 我使用标签作为列表项用户控件的一部分 用户可以单击它来选择列表项 然后双击它来重命名它 但是 如果剪贴板中有名称 双击标签会将其替换为标签文本 我还检查了应用程序中的其他标签 双击它们也会将其复制到剪贴板 我没有在这个程序中编
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver

随机推荐

  • 如何更新我的流星项目中的 cordova-plugin-device ?

    当我运行流星项目时 我收到此警告 警告 尝试安装插件 电子邮件受保护 cdn cgi l email protection 但 它的最低版本应为 1 1 1 以确保与 当前平台版本 安装最小 版本以方便起见 但您应该调整您的依赖项 然后 我
  • Angular 2 中的 ag-grid 单元测试

    有人在 Angular 2 中对 ag grid 组件进行过单元测试吗 对我来说 测试用例运行时 this gridOptions api 仍然未定义 很抱歉参加聚会有点晚了 但几天前我一直在寻找这个问题的答案 所以想为最终来到这里的其他人
  • iOS 12.1 上的 UITabBar 项目在返回导航上跳跃

    我有一个 iOS 应用程序UITabBarController在主屏幕上 导航到隐藏的详细信息屏幕UITabBarController有设置hidesBottomBarWhenPushed true 返回主屏幕时UITabBarContro
  • 使用 EnableCors 时“请求的资源不支持 http 方法‘OPTIONS’”

    我想在 Asp net Web Api 中的一项特定操作上启用 CORS 我正在尝试这样做 Route api mycontroller myaction HttpPost EnableCors https example com post
  • 如何强制编译器在 C++ 中通过引用传递某些变量?

    这是一个简单的例子 template
  • 如何预渲染多个Vue应用页面?

    我正在尝试 未成功 在使用 Vue CLI 搭建的同一项目中预渲染多个 Vue 应用程序的 HTML 由于多种原因 我不想使用 Vue Router 或 Nuxt 等 我尝试过使用预渲染 Spa 插件 https github com ch
  • 关于 Python 解析器生成器的建议

    我接到一项任务 必须为简单的类 C 语言创建一个解析器 我可以使用任何我希望创建解析器的编程语言和工具 但我同时正在学习 Python 所以它是我的首选 我的解析器必须遵循一些限制 首先 它必须能够读取包含以下信息的文本文件 kind1 s
  • 在 IIS 中启用 JavaScript GZIP 压缩?

    我们希望使用 GZip 压缩庞大的 JavaScript 文件 以加快网站的页面加载速度 我知道这可以通过 IIS 来完成 但我似乎找不到关于如何实现它的简单分步指南 如果有人能向我指出这样的指南 我将非常感激 我以前从未这样做过 所以它需
  • 在 Dockerfile 中安装节点?

    我是AWS elastic beanstalk的用户 我遇到了一些问题 我想用 less node 构建我的 CSS 文件 但我不知道在使用 jenkins 构建时如何在 dockerfile 中安装节点 这是我在 docker 中使用的安
  • 对数组中的每个元素设置 $scope.$watch

    我想弄清楚如何设置 scope watch在数组中的每个元素上 我只关心每个元素的某些属性 在我的例子中 每个rental date对象具有三个属性 date start time and stop time 每当start time已更改
  • 如何从 firebase 导出无崩溃的用户?

    我想将有关崩溃和无崩溃用户指标的数据保留在数据库中以供进一步分析 我已经将该项目链接到 BigQuery 但找不到计算方法无崩溃用户BigQuery 中包含的数据价值 是否可以以某种方式导出无崩溃的用户指标 这里是 Fabric Fireb
  • 将 system.web 应用程序池添加到 web.config 会导致 500 内部服务器错误

    我正在尝试将以下内容添加到我的网络配置中
  • 如何从构建管道内的项目存储库中的azure存储blob下载文件(Azure DevOps)

    需要一种在构建过程中将一组文件从 Azure Blob 存储下载到项目存储库的方法 该流程的目的是对移动应用程序进行 CI CD 但是移动应用程序的图标 背景图像和一些其他图像是由其他应用程序提供的 因此在构建过程中图像应该从 blob 存
  • 访问 Spring-MVC 中的应用程序属性

    Spring MVC 的新手 我想在 properties 文件中存储两个属性 uploadFolder downloadFolder 在 HomeController 类 由 MVC 模板自动创建 中访问它 你能指导我如何 1 用上面的内
  • 自定义类上的 List.sum

    我有以下代表 GF2 字段的代码 trait GF2 def unary this def that GF2 GF2 def that GF2 GF2 def that GF2 that match case Zero gt throw n
  • 运行 istio-proxy 后启动容器/pod

    我正在尝试使用 Istio 和 Envoy 通过 Kubernetes 实现服务网格 我能够设置服务和 istio proxy 但无法控制容器和 istio proxy 的启动顺序 我的容器是第一个启动的 并尝试通过 TCP 访问外部资源
  • MSBuild 多个输出路径

    I saw this https stackoverflow com questions 14107302 msbuild copy multiple files to multiple directories repeatedlyS O
  • Java:使用反射正确检查类实例化

    我正在尝试使用最简单的反射形式之一来创建类的实例 package some common prefix public interface My void configure void process public class MyExamp
  • jQuery select2 与 WordPress

    我正在使用 jQueryselect2 https select2 org在 WordPress 内 我有一个像这样的 HTML 表格 如果用户点击我需要这里Bob SMith and admin它将转换为select2具有多项选择的下拉菜
  • 制作域中立程序集的步骤是什么?

    这些步骤也可以应用于第三方议会 可能已经是强名称的 吗 我的问题的上下文应该不重要 但无论如何我都会分享 我正在考虑制作一个记录器 或日志包装器 它始终知道要定位的 日志源 无论使用它的程序集是否是在一个应用程序域中 或分布在多个应用程序域