私の目標は、シャドウコピーされたアプリケーションを起動する実行可能ファイルを作成することです。秘訣は、このスタータープログラムに外部依存関係がなく、起動する必要のあるプログラムに関する知識が含まれていないようにすることです。
また、ディレクトリ内で唯一の実行可能ファイルにしたいです。つまり、.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でそれを見つけることは可能ですか、それとも別のルートに移動するために辞任する必要がありますか?