【发布时间】:2010-09-25 00:23:33
【问题描述】:
在使用 C++/CLI 创建 DLL 时,或者我应该问,是否存在与 DllMain 等效的方法?
这个初始化代码不能调用什么有什么限制吗?
【问题讨论】:
在使用 C++/CLI 创建 DLL 时,或者我应该问,是否存在与 DllMain 等效的方法?
这个初始化代码不能调用什么有什么限制吗?
【问题讨论】:
Dan:关于加载器锁、C++/CLI 对 CLR 的延迟加载以及混合模式二进制文件的正确初始化,我昨天刚刚在 the subject here 上发帖。
或多或少,如果你有一个混合模式的二进制文件,当你在DllMain() 时,你不能导致任何托管代码运行。
【讨论】:
从 .NET 2.0 开始,您就有了“模块初始化程序”。见here for more information on how that solves the loader lock problem和also here
要直接回答您的问题,this page quotes the standard 表示: “模块初始化程序中允许的代码没有限制。模块初始化程序可以运行和调用托管和非托管代码。”
【讨论】:
Assembly.Load() 返回之前运行”)是您自己的理论,与规范中的声明有很大不同。不知道你是不是误解了before的意思或者access the types, methods, or data的意思,但是如果你说的是Assembly.Load(),你显然不明白保证的真正含义。
如果您在另一个托管项目(例如 ac# 应用程序)中使用 dll,则无需执行任何操作...只要您尝试访问的类是 ref 类,您就可以从任何其他托管应用程序访问它们。
【讨论】:
.Net dll 的一个巨大优势是它们避免了加载程序锁定。一个副作用是没有 DllMain。
【讨论】: