我希望在从另一个程序集实例化时在类库中执行某些代码。是否有类库的入口点或引导程序?我认为一个静态方法Main可以做到这一点,但我错了。 应用程序可能是配置和实例化记录器单例,未处理的异常处理程序等。
答案 0 :(得分:2)
库本身并不是一个起点。当实例化库的类时,您调用的第一条指令是类的构造函数(新)及其基本构造函数(如果它们在构造函数定义上)。
答案 1 :(得分:1)
您是否查看了PreApplicationStartMethodAttribute?
using System.Web;
[assembly: PreApplicationStartMethod(typeof(ClassLibrary.Startup), "Start")]
namespace ClassLibrary
{
public class Startup
{
public static void Start()
{
// do some awesome stuff here!
}
}
}
更多细节:http://dochoffiday.com/professional/simulate-application-start-in-class-library
答案 2 :(得分:0)
AppDomain.AssemblyLoad Event。可能用于在类库中调用initialize方法。
public static void Main()
{
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyLoad += new AssemblyLoadEventHandler(MyAssemblyLoadEventHandler);
}
static void MyAssemblyLoadEventHandler(object sender, AssemblyLoadEventArgs args)
{
Console.WriteLine("ASSEMBLY LOADED: " + args.LoadedAssembly.FullName);
//If this is the assembly that you want to call an initialize method..
}
以下是两个相似的主题
答案 3 :(得分:0)
最好和安全的方法是设计您的库,以便调用者在知道可以的情况下初始化您的库。
在加载装配体时,CLR会使用大量机械来完成工作,从内部平台的设计方式开始,将模块加载到CLR本身。每个参与的演员都有自己的局限性。
由于相同的原因,在模块加载时执行代码不是Win32上的最佳实践:您不知道调用者在做什么;同样,您所做的更改可能会更改当前的AppDomain,但可能不会传播到应用程序的所有其他AppDomain中。
有意识的初始化方法是让调用者控制程序集初始化的最干净的方法。
所有其他答案均部分解决了该问题,但可能会带来不必要的副作用和不确定的行为。