- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在过去的几年里,我偶尔想知道 .NET 世界中有什么等同于(著名的)DLL_PROCESS_ATTACH
的东西。我的任何文档都说,稍微简化了,类的最早入口点是静态构造函数 (cctor),但你不能影响 when it is called ,也不能定义一个保证在任何其他 cctor 或字段初始值设定项之前被调用的 cctor,hack,如果从未使用过该类,它甚至可能根本不会被调用。
因此,如果您想保证在调用程序集的任何方法之前初始化某些东西,并且您不想必须向程序集中的每个类添加一个 cctor,您可以采用什么方法拿?或者有没有一种我多年来一直错过的 .NET 中的简单托管解决方案?
最佳答案
我通常不会回答我自己的问题,但与此同时我确实找到了一个以前没有出现过的答案,所以我来了。
经过一些研究,我碰巧在 this post by Microsoft ,这解释了在内部混合托管和非托管代码的问题 DllMain
以及第二版 CLI module initializers 中出现的解决方案。引用:
This initializer runs just after the native DllMain (in other words, outside of loader lock) but before any managed code is run or managed data is accessed from that module. The semantics of the module .cctor are very similar to those of class .cctors and are defined in the ECMA C# and Common Language Infrastructure Standards.
虽然我无法在当前 ECMA 规范中找到术语模块初始化器,但它在逻辑上遵循类型初始化器 和全局 <Module>
特殊类别(参见第 22.26 节关于 MethodDef,子点 40)。此功能是在 .NET 1.1之后实现的(即,从 2.0 开始)。另见 this semi-official description .
这个问题不是关于 C# 的,而是因为它是 .NET 的通用语言:C# 不知道全局方法,您不能创建 <Module>
,更不用说它的cctor了。然而,Einar Egilsson 有 recognized this apparent deficiency并创建了 InjectModuleInitializer.exe,它允许您将此作为 Visual Studio 的后/编译步骤执行。在 C++.NET 中,使用此方法很简单,推荐使用此方法代替 DllMain
.另见 this SO answer by Ben Voigt (不是公认的答案)和这个 SO answer by yoyoyoyosef .
简而言之,模块初始值设定项是在加载模块之后(加载程序集时不一定!)和调用任何类或实例方法之前调用的第一个方法。它不接受任何参数,不返回任何值,但可以在其主体中包含任何托管代码。
关于c# - CLR 在调用程序集中的任何方法之前调用的最早入口点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3363569/
我正在尝试将数据框中的两列转换为“良好”的日期和时间类,但到目前为止还没有取得太大成功。我尝试过各种类(timeDate、Date、timeSeries、POSIXct、POSIXlt >)但没有成功
我的 Spring Boot 应用程序中有 3 个监听器。只有一名听众应该从头开始阅读主题。如果我添加到 yml 文件中: spring.kafka.consumer.auto-offset-rese
我是 MySQL 新手。谁能告诉我这个问题的答案? 表 Requests,具有以下架构: 领域 |类型 请求编号(PK) |整数 请求日期 |日期 必填日期 |日期 接受日期 |日期 状态 |字符(1
我的 Broker 中有一个名为“test”的主题。我用 CLI 检查过。 我创建了一个 java 生产者来将消息发送到主题 test。我可以从 CLI 中使用它们。 .\kafka-console-
我是一名优秀的程序员,十分优秀!