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

时间:2012-03-06 03:35:02

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

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

我也希望它是目录中唯一的可执行文件。换句话说,我希望它“运行”.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是否可以找到它,或者我是否只需要让自己去另一条路线?

3 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:1)

我发现这个建议并不那么容易理解。经过一些实验,这就是我取得成功的方式:

我创建了一个带有简单main的控制台应用程序,并包含了原始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的Main。谢谢你的讨论!

答案 2 :(得分:-3)

简短的回答是否定的。 .DLL文件是动态链接库,是另一个库调用的代码。我猜Keith说技术上会起作用..你可以将它重命名为你想要的甚至.txt或.pdf,只要你以正确的方式启动应用程序。我的主要问题是这个;你想做什么??除非您尝试编写恶意软件,否则为什么要这样做呢? 并不是说我为了恶劣目的而宽恕恶意软件的写作,但我知道人们喜欢在他们自己的实验室中进行实验,所以我不会谴责它。如果您正在编写类似c ++的恶意软件,c或汇编程序可能是一个更好的选择,我猜C#可以完成工作但是... ...