问题标签 [clr-module-initializer]
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# - C# 中的模块初始化器
模块初始值设定项是 CLR 的一项功能,在 C# 或 VB.NET 中不直接可用。它们是命名的全局静态方法.cctor
,保证在程序集中的任何其他代码(类型初始值设定项、静态构造函数)执行之前运行。我最近想在一个项目中使用它,并使用 Mono.Cecil 编写了我自己的解决方案(控制台程序/msbuild 任务) ,但我想知道:
有没有办法欺骗 C# 编译器发出模块初始化程序?任何可以使用的属性(例如 CompilerGenerated、SpecialName)或其他诡计?
C# / VB.NET 是否曾经出于某种目的自己发出这些初始化程序?从我所看到的情况来看,托管 C++ 将它们用于某些互操作目的,但我找不到任何关于它们被用于其他目的的引用。有任何想法吗?
module - 我的 __init 被调用,但没有接到探测电话
我在 raspberry linux 中启用了 pinctrl 驱动程序,我尝试了一些方法并启用了它。
但是发生的事情是,__init 正在调用,但探测器没有被 linux 调用。
我的代码是
这是探针
谁能帮我解决这个问题?
我没有找到我做错的地方,为什么探测器没有调用?
c# - 加载程序集时运行代码
我的库中有一些代码,我想在加载程序集时即时运行。类似于例如 Owin 自动初始化自身的方式。
这是你做的方式吗? .Net:加载程序集时运行代码
.net - 有没有办法自定义默认模块初始化程序?
我正在将现有的 C++ 库编译为 C++/CLI DLL。C++ 库有两个初始化例程,需要调用它们来设置各种查找表。
C++ 库最初使用<mutex>std::once_flag
来std::call_once()
执行查找表的一次性初始化。但是,在 C++/CLI 中,不支持 <mutex> 标头:
使用 /clr 或 /clr:pure 编译时不支持错误 <mutex>
然后我尝试使用std::atomic_flag
<atomic>,但 C++/CLI 也不支持 <atomic> 标头。
看到我在哪里初始化托管 C++/CLI DLL 之后?然后我尝试实现 DllMain(),但遇到了 C++ 库的初始化例程需要调用托管代码的问题。就我而言,我无法将初始化例程编译为非托管代码(使用#pragma unmanaged
)。
然后我尝试了一个模块初始化程序:
但是,这会导致以下形式的 33 个链接器警告:
1>some.obj : 警告 LNK4210: .CRTMP 部分存在;可能有未处理的静态初始化器或终止器
我想我的自定义模块初始化程序正在覆盖编译器生成的模块初始化程序,它可以正确运行所有静态初始化,例如设置全局变量的初始值。
有没有办法自定义编译器生成的模块初始化器或以其他方式安排编译器生成的模块初始化器调用库初始化例程?
c++ - 托管代码的 C++/CLI 模块初始化程序
是否可以为 c++/cli 动态库运行托管初始化代码?我有大量托管类,它们都包装了底层非托管功能,被许多不同的解决方案使用。我现在需要在执行其他任何操作之前调用一些托管代码,并且我已经尝试了几次但还没有成功。
我最初尝试在 DllMain 函数中运行代码,但很快意识到您不能在 DllMain 中调用托管代码,因为它不安全并且会发生 LoaderLock。然后我发现我可以像这样编写自己的模块构造函数:
但是,这似乎覆盖了默认的模块构造函数,并且我收到了很多链接器警告,例如:
一些研究表明,默认模块构造函数_DllMainCRTStartup 调用_CRT_INIT,它初始化C/C++ 静态对象。普遍的共识似乎是重写 dll 的入口点是一个非常糟糕的主意,我不想给自己造成更多的问题。
我尝试的最后一件事是在全局范围内创建托管初始化程序类的全局静态对象,希望它可以在 _CRT_INIT 内初始化,但似乎并非如此。
有什么方法可以作为模块初始化执行一些托管代码,甚至执行延迟代码,这些代码仍然保证在模块中的任何其他内容之前被调用?
谢谢,目前我依赖于提供在应用程序级别调用的静态初始化函数,但我显然不能强制该库的所有用户在他们的应用程序中执行此操作。我看到的另一个选项是在所有托管类构造函数中添加初始化调用,但同样,我不能确定在这个库上构建的任何人都会遵循相同的设计模式,而且它似乎需要维护很多,特别是如果有是进行 CLR 模块初始化的一种简单方法。
c# - 通过反射在 C# 中查找模块初始化程序
有没有办法通过反射在 c# 中找到模块初始化程序?我正在加载一个类型完全未知的程序集,但程序集中肯定会有一个模块初始化程序,但似乎没有任何方法可以使用反射找到它。为了使加载的程序集正常运行,它必须运行它的 MI。这是我目前正在尝试的:
请注意,我尝试使用这些标志查找模块中的所有方法,因为如果您使用 ildasm 检查 MI,名称似乎被混淆了。不幸的是,它不返回任何方法。
使用 Visual Studio 中的调试器,您可以看到它被声明为模块中的成员,但它被声明为模块中的方法,这可能是 GetMethods 没有返回的原因。
我怎样才能找到它?
c# - [ModuleInitializer] 的行为不正确?
我尝试在 .net5 代码中使用 [ModuleInitializer]。我的测试程序集
我需要在程序集加载时调用 Init() 方法。加载代码
但是在加载时不会调用初始化程序。我也试过
初始化器在之后调用
即第一次使用程序集中的任何类型。这是正常行为吗?我可以在没有任何附加代码的程序集加载的情况下实现对初始化程序的调用吗?