是否可以在加载程序集时运行某些代码,而无需在加载代码中执行任何特定操作?我正在寻找的就像一个类型的静态构造函数.
例如:
程序集A不知道程序集B,但B确实知道A.如果加载B,程序集A需要知道关于B的某些事情.当程序集B由运行时加载(引用或显式)时,我想要执行一段调用程序集A中的方法的代码(静态方法或属性).
此问题的根本原因是序列化A中的类型时遇到的未知类型,该类型包含B中的类型,这些类型在编译时未知,因为使用了接口.
CLR支持模块初始化器.您必须破解C++/CLI代码或ilasm.exe才能使用它们.
您可以在.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.
在您的事件处理程序中,您可以反映新加载的程序集,并让它执行您喜欢的任何代码.
(编辑 - 适用于C#;对于C++方法,请参阅此答案)
基本上,不,你不能.这将是一个巨大的攻击面,是不允许的.您可能希望在某些B类型上放置一个静态ctor,以确保执行init代码,但这是关于它的......
有3个选项来初始化.NET程序集:
您在程序集中编写要初始化的静态函数Init()或Main(),并通过加载该程序集的C#代码进行反射来调用此函数。
编写一个托管C ++程序集,将代码放入DllMain()中。请小心,因为您的代码将在禁止执行某些操作的加载程序锁中执行(例如,加载其他DLL,...)。但是您可以启动一个执行任何初始化工作的新线程。(关于LoaderLock:https ://msdn.microsoft.com/zh-cn/library/ms173266.aspx )(关于DllMain:从 C#到C ++ / CLI到C DLL System.IO.FileNotFoundException)
您编译纯C#程序集并修改编译的DLL,以添加模块初始化程序代码,如下所述:http : //einaregilsson.com/module-initializers-in-csharp/ 此方法的缺点是未调用初始化函数程序集加载到流程中后立即进行。但是在首次访问程序集中的任何其他内容之前先调用它。