我的目标是创建一个可启动卷影复制应用程序的可执行文件。诀窍是,我希望这个入门程序没有外部依赖关系,并且不必包含任何有关它必须启动的程序的知识。
我也希望它是目录中唯一的可执行文件。换句话说,我希望它“运行”.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是否可以找到它,或者我是否只需要让自己去另一条路线?
答案 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#可以完成工作但是... ...