c# - C# .dll 程序集可以包含入口点吗?

标签 c# assemblies appdomain .net-assembly entry-point

我的目标是创建一个可执行文件来启动影子复制的应用程序。诀窍是,我希望这个启动程序没有外部依赖性,并且不必包含有关它必须启动的程序的任何知识。

我还希望它是目录中唯一的可执行文件。换句话说,我希望它“运行”一个 .dll 程序集而不是 .exe 程序集。 (我可以要求加载到新 AppDomain 中的 .dll 文件的名称每次都相同,例如 Main.dll 或类似的名称。)

它看起来像 AppDomain.ExecuteAssembly会做我想做的。它说它将在“.NET Framework header 中指定的入口点”开始执行。

当我尝试使用该函数时,出现错误“在程序集‘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,正在启动的应用程序将只需要一个 static void Main,这真的很简单而且很难搞砸。

是否有可能让 .dll 程序集有一个默认入口点,并让 ExecuteAssembly 找到它,或者我是否只能放弃自己走另一条路?

最佳答案

您可以将 .NET 应用程序编译为 exe(这是一个程序集)并将其重命名为 .DLL,它将充当普通的 .NET .dll 程序集。然后它将有您的入口点。

关于c# - C# .dll 程序集可以包含入口点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9577567/

相关文章:

c# - 在 .NET 中迭代匿名类型的集合

c# - 如何从命令对象中访问整个 ViewModel

c# - 如何在 C# 中启动进程,但仅在卸载所有程序集后才运行该进程?

c# - 在 C# 项目中包含用于单元测试的资源文件

silverlight - 平面投影在 Silverlight 中运行不佳

c# - 如何在多线程应用程序中正确卸载AppDomain?

c# - int 到字节数组

c# - 检测移动物体与静止物体之间的碰撞

wcf - WCF 中 AppDomain 的生命周期是多长?

com - 无法使用 System.IO.Packaging 确定域的标识