19

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

我还希望它是目录中唯一的可执行文件。换句话说,我希望它“运行”一个 .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 可以找到它,还是我只需要辞职走另一条路?

4

3 回答 3

25

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

于 2012-03-06T03:41:11.700 回答
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。谢谢各位讨论!

于 2014-02-18T17:10:45.763 回答
-4

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

于 2012-03-06T04:18:51.237 回答