2011-12-20 8 views
3

アセンブリがロードされたときにいくつかの操作を実行するために "OnLoad"イベントにフックする方法があるかどうか知りませんか?クラスライブラリの "OnLoad"へのフック

具体的には、アプリケーション用のプラグインを作成しています。プラグインのDLLがロードされ、オブジェクトの使用が開始されますが、問題が発生する前に別のアセンブリを動的にロードする必要があります。このアセンブリをアプリケーションのディレクトリにコピーすることはできません。また、このアセンブリは不可視のままでなければなりません。

+0

可能な複製[SilverlightとWindows Phone 7でサポートされているモジュール初期化子ですか?](http://stackoverflow.com/questions/5365994/are-module-initializers-supported-in-silverlight-and-windows-phone-phone- 7) –

答えて

1

あなたはAssemblyLoadイベントにフックする必要があります。

Refer- http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyload.aspx

+0

私はそれを見ましたが、その問題はクラスライブラリに "Main"関数がないということです。アプリが何かをインスタンス化しようとする前に、そこにフックを入れる場所が必要です。 –

1

国会DLLにmain()関数を書くことは、.NETフレームワークによって呼び出されることはありませんということは本当に悲しいです。 Microsoftはそれを忘れてしまったようです。

しかし、あなたは簡単に自分でそれを実装することができます

DLLアセンブリでは、あなたがこのコードを追加します。

using System.Windows.Forms; 

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

次にエグゼ総会でこの機能を追加し、このDLLをロードする:

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

明らかに、このアセンブリを使用する前に、この関数を最初に呼び出す必要があります。

0

C#ではこれを行う方法はありませんが、基になるILコードはmodule initializersで行います。 Fody/ModuleInitのようなツールを使用して、特別な名前の静的C#クラスを、dllがロードされたときに実行されるモジュール初期化子として実行するようにすることができます。

関連する問題