【发布时间】:2012-03-23 13:40:00
【问题描述】:
我的目标是创建一个可执行文件来启动影子复制应用程序。诀窍是,我希望这个启动程序没有外部依赖项,并且不必包含有关它必须启动的程序的任何知识。
我还希望它成为目录中唯一的可执行文件。换句话说,我希望它“运行”一个 .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() );
}
}
This page on Main() functions 说“库和服务不需要 Main 方法作为入口点”。它也没有说他们不能有默认入口点。
我已经尝试了 public/private static void main、int 返回类型、string[] args 作为参数、有命名空间、没有命名空间、静态/非静态类等的所有各种排列。
我能够将我的代码更改为从 MarshalByRefObject 继承,然后使用 CreateInstance 创建一个对象,但这似乎会使启动器与它应该启动的程序更紧密地耦合。如果我可以使用 ExecuteAssembly,正在启动的应用程序只需要一个静态 void Main,这真的很简单,也很难搞砸。
.dll 程序集是否有可能有一个默认入口点,并且 ExecuteAssembly 可以找到它,还是我只需要辞职走另一条路?
【问题讨论】:
-
拥有 .NET 程序集 (dll) 的入口点是没有意义的,因为它本身不会作为进程启动。
标签: c# assemblies appdomain .net-assembly entry-point