首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >挂接到类库的"OnLoad“中

挂接到类库的"OnLoad“中
EN

Stack Overflow用户
提问于 2011-12-20 04:57:31
回答 3查看 5K关注 0票数 6

有没有人知道有没有办法挂钩到一个"OnLoad“事件,以便在程序集加载时运行一些操作?

具体地说,我正在为应用程序创建一个插件。加载插件的DLL并开始使用对象,但问题是我需要在发生任何事情之前动态加载另一个程序集。此程序集不能复制到应用程序的目录中,必须保持对其不可见。

EN

回答 3

Stack Overflow用户

发布于 2011-12-20 05:01:32

票数 1
EN

Stack Overflow用户

发布于 2015-01-07 15:58:58

在Assembly DLL中编写Main()函数从未被.NET框架调用,这真是令人遗憾。微软似乎忘记了这一点。

但是您可以很容易地自己实现它:

在DLL程序集中添加以下代码:

代码语言:javascript
运行
AI代码解释
复制
using System.Windows.Forms;

public class Program
{
    public static void Main()
    {
        MessageBox.Show("Initializing");
    }
}

然后,在加载此DLL的Exe程序集中添加以下函数:

代码语言:javascript
运行
AI代码解释
复制
using System.Reflection;

void InitializeAssembly(Assembly i_Assembly)
{
    Type t_Class = i_Assembly.GetType("Program");
    if (t_Class == null)
        return; // class Program not implemented

    MethodInfo i_Main = t_Class.GetMethod("Main");
    if (i_Main == null)
        return; // function Main() not implemented

    try 
    {
        i_Main.Invoke(null, null);
    }
    catch (Exception Ex)
    {
        throw new Exception("Program.Main() threw exception in\n" 
                            + i_Assembly.Location, Ex);
    }
}

显然,在对该程序集做任何其他操作之前,您应该在一开始就调用此函数。

票数 1
EN

Stack Overflow用户

发布于 2017-11-22 20:29:29

C#不提供这样做的方法,但是底层的IL代码通过module initializers提供。您可以使用诸如Fody/ModuleInit之类的工具将一个特别命名的静态C#类转换为一个模块初始化器来运行,该初始化器将在加载dll时运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8570999

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文