C# 挂在一个;“满负荷”;对于类库

C# 挂在一个;“满负荷”;对于类库,c#,.net,dll,assemblies,onload,C#,.net,Dll,Assemblies,Onload,有人知道当程序集加载时,是否有方法钩住“OnLoad”事件来运行某些操作吗 具体来说,我正在为应用程序创建一个插件。插件的DLL被加载,对象开始被使用,但问题是我需要在任何事情发生之前动态加载另一个程序集。无法将此程序集复制到应用程序的目录,并且必须对其不可见。您需要挂接到AssemblyLoad事件 提及- 在程序集DLL中编写Main()函数从未被.NET framework调用,这真是令人伤心。 微软似乎忘记了这一点 但您可以轻松地自行实施: 在DLL程序集中添加以下代码: using S

有人知道当程序集加载时,是否有方法钩住“OnLoad”事件来运行某些操作吗


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

您需要挂接到
AssemblyLoad
事件

提及-
在程序集DLL中编写Main()函数从未被.NET framework调用,这真是令人伤心。 微软似乎忘记了这一点

但您可以轻松地自行实施:

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

using System.Windows.Forms;

public class Program
{
    public static void Main()
    {
        MessageBox.Show("Initializing");
    }
}
然后在加载此DLL的Exe程序集中添加以下函数:

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);
    }
}

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

C#没有提供执行此操作的方法,但底层IL代码通过。您可以使用一些工具,例如将一个特殊命名的静态C#类作为模块初始值设定项运行,该初始值设定项将在加载dll时运行。

我确实看过,但问题是类库中没有“Main”函数。。。在应用程序尝试实例化任何内容之前,我需要一个地方将钩子放在那里。可能重复的