我的目标是创建一个可执行文件来启动影子复制应用程序。诀窍是,我希望这个启动程序没有外部依赖项,并且不必包含有关它必须启动的程序的任何知识。
我还希望它是目录中唯一的可执行文件。换句话说,我希望它“运行”一个 .dll 程序集而不是 .exe 程序集。(我可以要求加载到新 AppDomain 中的 .dll 文件的名称每次都相同,例如 Main.dll 或类似的名称。)
看起来AppDomain.ExecuteAssembly会做我想要的。它说它将在“.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() );
}
}
Main() 函数的这个页面说“库和服务不需要 Main 方法作为入口点”。它也没有说他们不能有默认入口点。
我已经尝试了 public/private static void main、int 返回类型、string[] args 作为参数、命名空间、无命名空间、静态/非静态类等的所有各种排列。
我能够将我的代码更改为从 MarshalByRefObject 继承,然后使用 CreateInstance 创建一个对象,但这似乎会将启动器更紧密地耦合到它应该启动的程序。如果我可以使用 ExecuteAssembly,正在启动的应用程序只需要一个静态 void Main,这真的很简单而且很难搞砸。
.dll 程序集是否有可能具有默认入口点,并且 ExecuteAssembly 可以找到它,还是我只需要辞职走另一条路?