2012-03-06 38 views
11

我的目标是创建一个可启动阴影复制应用程序的可执行文件。诀窍是,我希望这个初学者程序没有外部依赖关系,也不必包含任何有关它必须启动的程序的知识。C#.dll程序集是否可以包含入口点?

我也希望它是目录中唯一的可执行文件。换句话说,我希望它“运行”.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方法作为切入点”。它没有说他们不能有一个默认入口点。

我已经试过公共/私有静态无效的主要,一个int返回类型的所有各种排列,字串[] args作为参数,有一个命名空间,没有命名空间,静态/非静态类等

我能够将我的代码更改为从MarshalByRefObject继承,然后使用CreateInstance创建一个对象,但是似乎它会将启动器更紧密地耦合到它应该启动的程序。如果我可以使用ExecuteAssembly,那么正在启动的应用程序只需要一个静态无效Main,而且这非常简单,很难搞定。

是否有可能使.dll程序集有一个默认入口点,并为ExecuteAssembly找到它,或者我只是不得不辞去自己走另一条路线?

+1

将.NET程序集(dll)的入口点本身不作为进程启动是没有意义的。 – Zenwalker 2012-03-06 03:48:49

回答

17

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

+0

这工作完美无需改变任何东西。想知道为什么我没有想到它......谢谢Keith。 – Sean 2012-03-08 14:02:40

-1

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

+0

我的答案是,编译器生成dll或exes,但都是程序集,它的只是exes是定义了入口点的程序集,这就是他所要求的。 – 2012-03-06 08:35:18

+1

不,没有恶意软件写在这里。我正在尝试创建一个小型启动程序来复制我的主应用程序。然后,我可以轻松地更新我的主应用程序,而无需跳过单独的可执行文件来进行更新等。我只是想让启动器尽可能完全分离,然后我可以将它用于所有应用程序。 – Sean 2012-03-06 17:05:54

+0

“除非你试图编写恶意软件”LOL !! – 2013-08-25 07:12:59

0

我发现建议不容易遵循。经过一番尝试,我得到了这样的成功:

我用一个简单的主创建了一个控制台应用程序,并包含了我原始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; 
    } 
    } 
} 

中提琴我可以执行,并在DLLTest.Main方法添加一个断点,看看,我可以调用DLLTest的主。感谢讨论伙计!

相关问题