19

私の目標は、シャドウコピーされたアプリケーションを起動する実行可能ファイルを作成することです。秘訣は、このスタータープログラムに外部依存関係がなく、起動する必要のあるプログラムに関する知識が含まれていないようにすることです。

また、ディレクトリ内で唯一の実行可能ファイルにしたいです。つまり、.exeアセンブリではなく.dllアセンブリを「実行」する必要があります。(新しいAppDomainにロードされる.dllファイルの名前は、Main.dllなどのように、毎回同じである必要があります。)

AppDomain.ExecuteAssemblyが私が望んでいたことを正確に実行するように見えました。「.NETFrameworkヘッダーで指定されたエントリポイント」から実行を開始すると書かれています。

その関数を使おうとすると、「アセンブリ'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() );
    }
}

Main()関数のこのページには、「ライブラリとサービスはエントリポイントとしてMainメソッドを必要としない」と書かれています。また、デフォルトのエントリポイントを持つことができないとも言っていません。

public / private static void main、int return type、引数としてstring [] argsのさまざまな順列をすべて試しましたが、名前空間、名前空間なし、静的/非静的クラスなどがあります。

MarshalByRefObjectから継承するようにコードを変更し、CreateInstanceを使用してオブジェクトを作成することはできましたが、スターターと起動するはずのプログラムをより緊密に結合するようです。ExecuteAssemblyを使用できれば、起動するアプリケーションには静的なvoid Mainが必要であり、それは非常に単純で混乱しにくいものです。

.dllアセンブリにデフォルトのエントリポイントを設定し、ExecuteAssemblyでそれを見つけることは可能ですか、それとも別のルートに移動するために辞任する必要がありますか?

4

3 に答える 3

25

.NETアプリをexe(アセンブリ)としてコンパイルし、名前を.DLLに変更すると、通常の.NET.dllアセンブリとして機能します。その後、エントリポイントが作成されます。

于 2012-03-06T03:41:11.700 に答える
1

アドバイスに従うのはそれほど簡単ではないことがわかりました。いくつかの実験の後、これが私が成功した方法です:

シンプルなメインでコンソールアプリケーションを作成し、元の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を使用するマザープログラムでは、最初に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;
    }
  }
}

ViolàDLLTest.Mainメソッドを実行してブレークポイントを追加し、DLLTestのメインを呼び出すことができることを確認できました。ディスカッションの皆さん、ありがとう!

于 2014-02-18T17:10:45.763 に答える
-4

簡単な答えはノーです。.DLLファイルは、別のライブラリによって呼び出されるコードであるダイナミックリンクライブラリです。キースが言ったことは技術的にはうまくいくと思います。適切な方法でアプリケーションを起動する限り、.txtや.pdfでも好きな名前に変更できます。私が持っている主な質問はこれです。あなたは何をしようとしているのですか??マルウェアを作成しようとしているのでない限り、なぜこれを実行したいのでしょうか。悪意のあるマルウェアの作成を容認しているわけではありませんが、人々が自分のラボで実験することを好むことは知っているので、私はそれを非難しません。c ++、c、またはアセンブラーのようなマルウェアを作成している場合は、C#で作業を完了できると思いますが、...

于 2012-03-06T04:18:51.237 に答える