2012-03-06 6 views
11

私の目標は、シャドウコピーアプリケーションを起動する実行可能ファイルを作成することです。トリックは、このスタータープログラムに外部依存関係がなく、開始する必要のあるプログラムについての知識は必要ないと思っています。C#.dllアセンブリにエントリポイントを含めることはできますか?

また、ディレクトリ内で唯一の実行可能ファイルにしたいと思っています。言い換えれば、.exeアセンブリではなく.dllアセンブリを "実行"する必要があります。 (私は、新しいAppDomainにロードされている.dllファイルの名前を、Main.dllなどのように毎回同じにする必要があります)。それは、 ".NET Frameworkヘッダーで指定されたエントリポイント"で実行を開始すると言います。

この関数を使用しようとすると、「アセンブリ 'DllApp'にエントリポイントが見つかりません」というエラーが発生します。

だけでアセンブリを実行しようとしている私が持っているスタータープログラムは、:

static void Main() 
{ 
    AppDomain domain = AppDomain.CreateDomain("DllApp"); 
    domain.ExecuteAssembly("DllApp.dll"); 
} 

アプリケーションコード、.dllファイルで、デフォルトのエントリポイントと:

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
} 

This page on Main() functionsはと言います"ライブラリとサービスは、エントリーポイントとしてMainメソッドを必要としません"。 にはデフォルトエントリポイントもありません。

私は、int型の戻り値の型などの名前空間、名前空間なし、静的/非静的クラス、

と、引数として文字列[] argsは、メインのプライベート/パブリック静的ボイドのすべての様々な順列を試してみました

MarshalByRefObjectから継承するコードを変更してCreateInstanceを使用してオブジェクトを作成することはできましたが、起動するプログラムにスターターをより強く結びつけるように見えます。 ExecuteAssemblyを使用することができれば、起動されているアプリケーションは静的void Mainを必要とし、それは本当にシンプルで厄介です。

.dllアセンブリがデフォルトのエントリポイントを持ち、ExecuteAssemblyがそれを見つけることは可能ですか、別のルートに行くことを辞さなければなりませんか?

+1

.NETアセンブリ(dll)のエントリポイントは、プロセスとして起動されないため、意味がありません。 – Zenwalker

答えて

17

.NETアプリケーションをexe(アセンブリ)としてコンパイルし、名前を.DLLに変更すると、通常の.NET .dllアセンブリとして動作します。それはあなたのエントリーポイントを持っています。

+0

これは他のものを変更することなく完全に機能しました。なぜ私はそれを考えなかったのだろうか...ありがとうKeith。 – Sean

-1

短い答えはノーです。 .DLLファイルは、別のライブラリによって呼び出されるコードである、動的にリンクされたライブラリです。キース氏は技術的にはうまくいくだろうと思っています。適切な方法でアプリケーションを起動している限り、.txtや.pdfなどの名前に変更することもできます。私が持っている主な質問はこれです。あなたは何をしようとしているのですか??マルウェアを書き込もうとしているのでなければ、なぜこれをやりたいのですか? 私は悪意のある目的のためにマルウェアの書き込みを許していませんが、人々は自分のラボで実験したいと思うので、私はそれを非難しません。あなたがC++のようなマルウェアを書いているなら、Cやアセンブラはもっと良い賭けかもしれません.C#が仕事をやってもらえるかもしれないと思っています...

+0

ポイントは私の答えでは、コンパイラはdllsまたはexesのいずれかを生成することですが、どちらもアセンブリです、そのちょうどexesは、彼が求めていたエントリポイントが定義されたアセンブリです。 –

+1

いいえ、こちらのマルウェアはありません。私は主なアプリケーションをシャドウコピーするための小さなスタータープログラムを作成しようとしています。それで、アップデート用の別の実行ファイルを飛ばしなくても、簡単にメインアプリケーションを更新することができます。できるだけスターターを完全に切り離してから、すべてのアプリケーションで使用することができました。 – Sean

+0

「マルウェアを書くつもりがない限り、LOL !! –

0

私は助けがそれほど容易ではありません。いくつかの実験を経て成功したのです:

私は単純なメインでコンソールアプリケーションを作成し、残りのコードはオリジナルのDLLから作成しました。以下は、DLLを含む簡略化されたプログラムです:

namespace FIT.DLLTest 
{ 
    public class DLLTest 
    { 
    [STAThread] 
    static void Main(string[] args) 
    { 
     int a = 1; 
    } 

    public DLLTest() 
    { 
     int b = 17; 
    } 

    public int Add(int int1, int int2) 
    { 
     return int1 + int2; 
    } 
    } 
} 

コンパイル後、生成された.exeの名前を.DLLに変更しました。

DLLを使用するマザープログラムでは、最初にReferenceとしてDLLTest.dllを追加した後、DLLを実行するコードを追加しました。

namespace TestDLLTest 
{ 
    class TestDLLTest 
    { 
    static void Main(string[] args) 
    { 
     AppDomain domain = AppDomain.CreateDomain("DLLTest"); 
     domain.ExecuteAssembly("DllTest.dll"); 

     DLLTest dt = new DLLTest(); 
     int res2 = dt.Add(6, 8); 
     int a = 1; 
    } 
    } 
} 

ヴィオラは、私が実行してDLLTest.Mainメソッドにブレークポイントを追加し、私はDLLTestのメインを呼び出すことができることを見ることができました。ディスカッションにご協力いただきありがとうございます!

関連する問題