2013-06-15 12 views
8

.dllが.dllを参照するアプリケーションがロードされたときなど、ロード直後に.dllがコードを実行する可能性があると最近聞いたことがあります。イベント私は自分のいくつかのテストを行って、ここで答えを探してみましたが、私は.dllの初期化メソッドを生成するための何らかの方法を見つけることができませんでした。.dll用の初期化コードの生成

アプリケーションによってロードされたときに.dllからコードを実行することが本当に可能かどうかを知りたいと思います。

もしそうなら、どうすればいいですか?

+0

具体的なユースケースは何ですか?それに応じて静的なコンストラクタのような他のメカニズムを使うことができるので... – Pragmateek

+0

私は、ユーザーが試用版またはライセンス版として使用できるライブラリ(.dll)を開発中です。私は、ライセンスを確認し、私の製品の使用に関するいくつかの統計を得るために、サーバーと通信したいと思います。 –

+0

静的なコンストラクタのスパイを使うかもしれないので、私は答えを投稿します。 – Pragmateek

答えて

6

WARNING(おかげでキャッチ用ベンフォークト :)):以下のコードのみが生成されたクラスをbeforefieldinitされないことを保証C#のに適用されます。 しかし、とC++/CLIように簡単に動作しないでください。あなたは、高度な操作を行うことができ、静的コンストラクタで

using System; 

class MyAwesomeLibrary 
{ 
    static MyAwesomeLibrary() 
    { 
     Console.WriteLine(string.Format("Hey {0} is using me!", Environment.UserName)); 
    } 

    public static int GetTheAnswer() 
    { 
     return 42; 
    } 
} 

class Client 
{ 
    static void Main() 
    { 
     Console.WriteLine("The answer is: " + MyAwesomeLibrary.GetTheAnswer()); 
    } 
} 

:私のコメントで述べたように、あなたがこのようなものを使用することができますので、


Managed C++ Static Constructor not called in .net4レジストリのチェック、サーバーとの通信などのようなもの...

あなたが悪い人(または権利を保護したい開発者/企業)の場合は、例外をスローすることができますn:

throw new Exception("The library has not been correctly registered..."); 

この結果、TypeInitializationExceptionはライブラリクラス全体の使用を妨げます。

それとも、CheckMe方法のANSは、彼らが何かを使用するたびに使用しますセキュリティトークンを認証してもらうために、ライブラリを使用する前に、あるいはそれを呼び出すために、すべてのユーザーを尋ね実装することができます...

EDIT:あなたはより保護されるように、あまりにも(少し)あなたのライブラリーを難読化すべきことができますので、もしあなたが決定した攻撃を使う保護は逆コンパイルライブラリによってすべての配管を回避する可能性がどのような

。コメントをlongに

+0

+1実用的なサンプルを示しています。また、これは質問されたように質問に答えません - "アセンブリの負荷"で実行されるコードではなく、むしろタイプのメソッドを使用します。 –

+2

これは、ライブラリ全体の使用を妨げるものではありません。コンストラクタが例外を投げた型のちょうど使用。これを行うには、すべてのパブリック型の静的コンストラクタにコードを配置する必要があります。 –

+0

@Alexei:それは私の最後の文で言及されているように、専用メソッドのように明示的なものを持つ方が良いかもしれません。少なくともクライアントはクラッシュする理由を知っています。 _ @ mike:そういうわけで、私は "ライブラリ全体"ではなく、 "ライブラリ全体のクラス"と書いています。また、インターフェイスを返すだけの中心的なファクトリを使用してライブラリを設計し、ファクトリ自体以外の具体的な実装を公開することもできません。 – Pragmateek

-1

アプリケーションコンストラクタでdllコードを呼び出すことができます。 これは、アセンブリが解決されるポイントです。

+2

これは質問に答えることができません。また、間違ったアセンブリにはホエーが最初に必要です。正しく書かれたアプリケーションは、起動コードの依存関係の量を最小限にしようとします... –

+0

私はいつも起動時に読み込まれると思っていました。私はチェックし、あなたは正しい。 –

+1

この "アプリケーションコンストラクタ"とは何ですか? 'Application'から派生したクラスのコンストラクタを意味するならば、それはWPF固有です。そして、それは確かにアセンブリを解決することとは関係がありません。 – svick

2

...(重要なクラスの静的コンストラクタのような)あらゆる種類のスタートアップコードに非自明なコード(すなわち遅いリモートネットワークコールを)置くことはあなたのライブラリーのユーザーを疎外すること

注意。それはロード/メソッド呼び出しのランダムな遅延を避けるために特別なコードを書くように強制するかもしれません。

ライブラリで単に「validate license」メソッドを使用することは、おそらくもっと良い解決策です。

「電話機のホーム」機能自体は、しばしばユーザーから歓迎されず、よく文書化されていることに注意してください。特にあなたのライブラリを他の誰かのプログラムの一部として使用できるようにしたい場合。

関連する問題