在加载程序集时是否可以运行某些代码,而无需在加载代码中执行任何特定操作?我正在寻找的就像一个类型的静态构造函数。
例如:
程序集A不知道程序集B,但B确实知道A.如果加载B,程序集A需要知道关于B的某些事情。当程序集B由运行时加载(引用或显式)时,我想要执行一段代码(静态方法或属性)来调用程序集A中的方法。
此问题的根本原因是序列化A中的类型时遇到的未知类型,该类型包含B中的类型,这些类型在编译时未知,因为使用了接口。
答案 0 :(得分:39)
CLR支持module initializers。您必须破解C ++ / CLI代码或ilasm.exe才能使用它们。
答案 1 :(得分:6)
(编辑 - 适用于C#;对于C ++方法,请参阅this answer)
基本上,不,你不能。这将是一个巨大的攻击面,是不允许的。您可能希望在确保执行init代码的某些B类型上放置静态ctor,但这是关于它...
答案 2 :(得分:5)
您可以在.Net中使用静态构造函数,但遗憾的是它们并不能满足您的需求。静态构造函数仅在使用类型之前执行。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/k9x6w0hc(VS.80).aspx。
订阅AppDomain的AssemblyLoad事件可能会有一些里程。见http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyload.aspx。
在您的事件处理程序中,您可以反思新加载的程序集,并让它执行您喜欢的任何代码。
答案 3 :(得分:4)
初始化.NET程序集有3个选项:
答案 4 :(得分:3)
您可能应该重新访问序列化方法来缓解此问题。如果使用ISerializable
和SerializableAttribute
属性进行序列化,则可以使序列化图在必要时加载程序集B而不需要程序集A必须明确了解程序集B.
答案 5 :(得分:0)
使用混合程序集,您可以让DllMain在程序集加载时运行。