C# 如何在程序集中的任何方法之前编写要执行的代码?
有一个事件允许清理与类的任何特定实例甚至任何特定类无关的静态资源。 我认为它是在当前程序集中的任何代码之后执行的代码(顺便问一下,我是不是这样?) 但是,有没有一种方法可以编写一段代码(用于当前程序集),该代码将在当前程序集(类库)中的任何其他代码之前执行?或者我应该在任何代码开始执行之前寻找一种更棘手的方法来初始化某些资源吗 我知道静态构造函数,但是它们调用的顺序没有很好的定义。换句话说,不能保证特定的静态构造函数会在其他类的其他静态构造函数之前执行C# 如何在程序集中的任何方法之前编写要执行的代码?,c#,.net,appdomain,C#,.net,Appdomain,有一个事件允许清理与类的任何特定实例甚至任何特定类无关的静态资源。 我认为它是在当前程序集中的任何代码之后执行的代码(顺便问一下,我是不是这样?) 但是,有没有一种方法可以编写一段代码(用于当前程序集),该代码将在当前程序集(类库)中的任何其他代码之前执行?或者我应该在任何代码开始执行之前寻找一种更棘手的方法来初始化某些资源吗 我知道静态构造函数,但是它们调用的顺序没有很好的定义。换句话说,不能保证特定的静态构造函数会在其他类的其他静态构造函数之前执行 还有一个问题。我不确定这是我要找的东西。加
还有一个问题。我不确定这是我要找的东西。加载其他程序集而不是当前程序集时发生此事件 您可以使用静态字段中持有的
惰性
的实例自己控制静态初始化顺序。那些Lazy
初始值设定项对象的代码体可以引用其他Lazy
实例,这些实例会自动编排DAG初始化。显然,你不能有循环
使用C++/CLI,您确实可以在加载程序集(模块初始值设定项)时执行代码。你可能不想走那条路
使用C#这是不可能的。静态CTOR和惰性初始化模式是最好的选择。您可能希望扫描代码并找到需要完成初始化的地方 然后,在初始化尚未运行时,在需要之前启动初始化 在.NET中,您根本不知道何时加载程序集,因此无法保证在所有情况下都能及时启动初始化 另一种方法是程序集的客户端通过调用方法显式地初始化。(如果尚未加载程序集,也将加载该程序集)
AssemblyLoad事件可以像在客户端中那样用于检测特定程序集的加载,但这将使初始化依赖于客户端实现,而第一个解决方案将此职责保留在程序集本身的范围内。我遇到了相同的问题,并以这种方式解决了它。 我使用方法
void Initialize()
定义了一个iasembyinitializer
接口。
在每个程序集中,我想在加载后执行一些代码,我定义了一个实现这个接口的类。
我定义了一个属性来指定实现该接口的程序集中的类(否则您可以通过反射找到它们,但我更喜欢这样):
属性在AssemblyInfo中的设置方式如下:
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public class AssemblyInitializerAttribute : Attribute
{
AssemblyInitializerAttribute ()
{
}
AssemblyInitializerAttribute (string typeName)
{
TypeName = typeName;
}
public string TypeName;
}
[assembly: AssemblyInitializerAttribute ("MyNamespace.AnAssemblyInitializer")]
最后,在应用程序的主程序集中,我向AssemblyLoad事件注册了一个执行所有初始化的方法:
AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(NewAssemblyLoaded);
static void NewAssemblyLoaded(object sender, AssemblyLoadEventArgs args)
{
Assembly anAssembly = args.LoadedAssembly;
AssemblyInitializerAttribute[] initializers = (AssemblyInitializerAttribute[])anAssembly .GetCustomAttributes(typeof(AssemblyInitializerAttribute), false);
foreach (AssemblyInitializerAttribute anInit in initializers)
{
Type initType = anInit.TypeName != null ? anAssembly.GetType(anInit.TypeName) : null;
if (initType != null && initType.GetInterface("IAssemblyInitializer") != null)
{
IAssemblyInitializer anInitializer = (IAssemblyInitializer)Activator.CreateInstance(initType);
anInitializer.Initialize();
}
}
}
你可以用它来做。C#中不直接支持它们,但如果您不反对使用它们对程序集进行后期处理,您可以使用它们。假设您无法控制类库的使用方式,您可以为库中的每个公共/受保护类编写静态构造函数,并从每个类调用初始化代码。显然,初始化代码必须跟踪第一次调用(通过静态字段)使其仅运行一次。AppDomain.CurrentDomain.AssemblyLoad在加载特定程序集时发生。@Dejo但程序集本身无法确定何时加载。>>AppDomain.CurrentDomain.AssemblyLoad在该特定程序集加载良好时发生,如何编写要在当前程序集中编译但在此事件中执行的代码,然后再释放此当前程序集?可能吗?或者我应该编写此代码以编译到其他依赖程序集吗?它不是即时的,但您可以,除了加载的第一个程序集之外。我按照下面的解释做