在不进行加载代码中特定操作的情况下,在程序集被加载时运行某些代码是否可能?我需要的是像类型上的静态构造函数一样的东西。
例如:
程序集 A 不知道程序集 B,但是 B 知道 A。如果已经加载了程序集 B,则在运行时(显式或引用)要执行一个代码片段(静态方法或属性),该代码片段调用程序集 A 中的一个方法以便程序集 A 可以了解有关 B 的某些信息。
这个问题的根本原因是当序列化 A 中包含未在编译时作为接口使用的 B 类型的类型时遇到了未知的类型。
在不进行加载代码中特定操作的情况下,在程序集被加载时运行某些代码是否可能?我需要的是像类型上的静态构造函数一样的东西。
例如:
程序集 A 不知道程序集 B,但是 B 知道 A。如果已经加载了程序集 B,则在运行时(显式或引用)要执行一个代码片段(静态方法或属性),该代码片段调用程序集 A 中的一个方法以便程序集 A 可以了解有关 B 的某些信息。
这个问题的根本原因是当序列化 A 中包含未在编译时作为接口使用的 B 类型的类型时遇到了未知的类型。
CLR支持模块初始化程序。您需要修改C++/CLI代码或使用ilasm.exe来使用它们。
更新:自.NET 5以来,C#也直接支持了[ModuleInitializer]特性
(编辑 - 适用于C#;有关C ++方法,请参见此答案)
基本上,不行:你不能这样做。这将是一个巨大的攻击面,是不允许的。您可能希望在一些B类型上放置静态构造函数以确保执行初始化代码,但仅限于此...
您可能需要重新审视您的序列化方法以减轻此问题。如果您使用 ISerializable
和 SerializableAttribute
属性进行序列化,您可以使序列化图在必要时加载程序集 B,而无需程序集 A 明确知道程序集 B 的存在。