gpt4 book ai didi

c# - 如何编写要在程序集中的任何方法之前执行的代码?

转载 作者:行者123 更新时间:2023-11-30 17:07:28 25 4
gpt4 key购买 nike

有一个事件AppDomain.CurrentDomain.DomainUnload它允许清理独立于类的任何特定实例甚至任何特定类的静态资源。我认为它是在我当前程序集中的任何代码之后执行的代码(我说得对吗?)。

但是有没有一种方法可以编写一段代码(针对当前程序集),使其在当前程序集(类库)中的任何其他代码之前执行?或者我应该寻找一种更棘手的方法来在任何代码开始执行之前初始化一些资源?

我知道静态构造函数,但它们的调用顺序没有明确定义。换句话说,不能保证某个特定的静态构造函数会在其他类的其他静态构造函数之前执行。

还有一个 AppDomain.AssemblyLoad .我不确定这是我要找的东西。当加载其他程序集而不是当前程序集时,会发生此事件。

最佳答案

我遇到了同样的问题,并通过这种方式解决了。我只使用 void Initialize() 方法定义了一个 IAssembyInitializer 接口(interface)。在我想要在加载后立即执行一些代码的每个程序集中,我定义了一个实现此接口(interface)的类。我定义了一个属性来指定实现此接口(interface)的程序集中的类(否则您可以通过反射找到它们,但我更喜欢这种方式):

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
public class AssemblyInitializerAttribute : Attribute
{
AssemblyInitializerAttribute ()
{
}
AssemblyInitializerAttribute (string typeName)
{
TypeName = typeName;
}
public string TypeName;
}

AssemblyInfo 中的属性是这样设置的:

[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# - 如何编写要在程序集中的任何方法之前执行的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14502346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com