当前位置: 首页 > 编程语言 > C#

在程序集加载时初始化库分享

时间:2023-04-10 18:31:27 C#

在程序集加载时初始化库我有一个.net库DLL,就像一个函数库。有很多静态类型和静态方法。我需要运行一些初始化代码来设置要使用的库。有没有办法确保在加载程序集时运行特定方法?类似于AppDomain.AssemblyLoad,但从程序集本身自动调用。我在想,也许有类似AssemblyAttribute的东西可以使用?目前我在静态构造函数中有这个初始化代码,但由于这是一个有很多入口点的库,所以不能保证会使用这个特定类型。谢谢!为什么我需要在使用任何数据之前加载所有数据,而不是在使用需要它的第一种类型时?我不相信有任何方法可以强制从程序集内部的程序集加载run方法。您可以在每种类型中放置一个静态构造函数,但坦率地说,我认为只有一种类型表示数据并提供对它的访问-并且只在该类型上放置一个静态构造函数更有意义。(如果您有可以单独使用的单独数据位,可以为它们创建单独的类型。)是的-有点-有点。使用EinarEgilsson提供的优秀小工具InjectModuleInitializer。将此可执行文件作为构建后步骤运行,以创建一个小的.cctor函数(模块初始化函数),该函数调用不带参数的静态void函数。如果编译器给了我们创建.cctor()的能力就好了,幸运的是我们很少需要这种能力。但是,这不是DllMain的完整替代品。CLR仅在程序集中调用任何方法之前调用此.cctor函数,而不是在加载程序集时调用。因此,如果您需要在程序集加载时发生某些事情,您需要让加载代码直接调用方法或使用我详述的hackhttps://stackoverflow.com/a/9745422/240845只有当您可以控制主执行程序集我有一个类似的问题,并通过创建一个属性“InitializeOnLoad”来解决它,该属性以带有Type参数的程序集为目标。然后,在主可执行文件中,我添加了一个简单的AppDomain.AssemblyLoaded处理程序,该处理程序扫描新加载的程序集以查找上述属性并在它们上调用System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor()。[AttributeUsage(AttributeTargets.Assembly,AllowMultiple=true)]publicclassInitializeOnLoadAttribute:Attribute{类型类型;publicInitializeOnLoadAttribute(Typetype){this.type=type;}publicTypeType{get{返回类型;}}}//主exe初始化很早的某个地方AppDomain.CurrentDomain.AssemblyLoad+=newAssemblyLoadEventHandler(AssemblyInitializer);staticvoidAssemblyInitializer(objectsender,AssemblyLoadEventArgsargs){//在InitializeOnLoad指定的类型中强制静态构造函数foreach(InitializeOnLoadAttributeattrinargs.LoadedAssembly.GetCustomAttributes(typeof(InitializeOnLoadAttribute),false))System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(属性.Type.TypeHandle);此外,如果您担心程序集可能在挂接AssemblyLoad事件之前已加载,您可以简单地运行AppDomain.GetAssemblies()并为它们调用“初始化程序”。这是可能的-只需向类添加一个静态构造函数。我不知道如何在不修改IL的情况下完成此操作。以上就是C#学习教程:在程序集加载上初始化库,分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处: