是否可以在没有exe加载的情况下执行.NET dll?

是否可以在没有exe加载的情况下执行.NET dll?,.net,assemblies,createprocess,.net,Assemblies,Createprocess,我很好奇是否有一种方法可以在新进程中执行静态.DLL方法,而不必为其创建.EXE 抱歉,这在本机Win32/64 DLL中是不可能的。那么.NETDLL程序集呢 更新:我忘了提到我主要感兴趣的是以编程方式(具体地说,是从C#代码)完成这项工作 谢谢 结论:虽然没有人“敢”说出来,但答案似乎都倾向于“不”。您需要通过一种常规方式(EXE、PowerShell等)启动一个进程,然后说服该进程加载DLL并在其中执行代码。我猜我是错误地希望托管DLL能够提供更多功能 再次感谢所有插话的人 只需启动Pow

我很好奇是否有一种方法可以在新进程中执行静态.DLL方法,而不必为其创建.EXE

抱歉,这在本机Win32/64 DLL中是不可能的。那么.NETDLL程序集呢

更新:我忘了提到我主要感兴趣的是以编程方式(具体地说,是从C#代码)完成这项工作

谢谢

结论:虽然没有人“敢”说出来,但答案似乎都倾向于“不”。您需要通过一种常规方式(EXE、PowerShell等)启动一个进程,然后说服该进程加载DLL并在其中执行代码。我猜我是错误地希望托管DLL能够提供更多功能


再次感谢所有插话的人

只需启动PowerShell提示符

  [Reflection.Assembly]::LoadFile("Name of your dll")
  [Your.NameSpace.And.TypeName]::YourMethod()
我知道你想从C#

使用程序集限定名称创建类型:

 var t = Type.GetType("NameSpace.Type,Name Of Dll");
 var m = t.GetMethod("NameOfMethod");
 m.Invoke(null, new object[] { params });
这应该让你开始


我不知道你所说的“在一个新进程中”是什么意思,但是把它包装成一个.exe/.ps1应该不难,你可以从命令行上的一些选项开始

因此,您不必为要调用的每个DLL创建新的.exe


但是如果你想启动一个新进程,你应该启动一个新进程,这通常是通过启动一个新的.EXE来完成的。

查看windows附带的rundll32.EXE程序。如果您知道有关dll的某些信息,有时可以使用此程序在该dll中运行代码。

可以使用.NET程序集。(好的,PowerShell是一个EXE,但不专门用于运行任何特定程序集的代码)

选项1:.NET InstallUtil(普通.NET安装的一部分)

添加对
System.Configuration.Install的引用,然后在程序集中删除类似的内容:

[System.ComponentModel.RunInstaller(true)]
public class Sample : System.Configuration.Install.Installer
{
    public override void Uninstall(System.Collections.IDictionary savedState)
    {
        base.Uninstall(savedState);

        this.Context.LogMessage("This can be in a .dll.");
        // Do your thing...
    }
}
然后滥用.NET InstallUtil:

%windir%\Microsoft.NET\Framework\v2.0.50727\installutil /logtoconsole=false /logfile= /u [your assembly .dll here]
这可能有点混乱,尤其是在没有所有命令行参数禁用日志记录的情况下

选项2:使用本机rundll32反转p/调用静态类方法

2016年编辑:现在是Nuget软件包:()

(msdn论坛,2007年)链接到IL汇编语言程序员参考(10/3/2000,第74页)的beta 1版本,其中说明:

如果指定了fromunmanaged,则 运行时将自动生成 thunk,它将转换非托管 方法调用托管调用,调用 方法,并将结果返回给 非托管环境

微软内部有更多的细节。NET IL汇编程序。(最佳搜索关键字:ilasm vtentry)

相关阅读:

(stackoverflow,2010年)

(stackoverflow,2010年)

(stackoverflow,2009年)

(,2010)-msbuild,vs2010集成

(mono,2011年)

(codeproject,2009)-没有64位支持

(codeproject,2006)-支持64位

(msdn论坛,2010)-代码列表

(代码项目,2004年)

潜在缺陷:

(msdn博客,2006年)


(msdn博客,2008)

您可以通过使用
rundll32.exe dll\u名称、方法\u名称来启动进程并运行dll函数。在C#中,您可以执行以下操作:

myProcess = new Process {StartInfo = {FileName = "rundll32.exe", Arguments = "my_dll_name.dll,my_function_name"}};
myProcess.Start();

只需确保DLL位于您的路径中。如果您正在考虑运行某种单元测试,请确保在拆卸/清理方法:
myProcess.kill()
上终止该进程,否则DLL可能会保持加载状态,并且您将无法在开发过程中覆盖它。您还应该查找一个命令行应用程序,该应用程序将杀死保存DLL的所有进程并将其添加到预构建事件中:
freelib.exe my_DLL_name.DLL

您的意思是从命令行或“运行”对话框还是从另一个应用程序?rundll32需要一个本机DLL,至少对于它打算执行的部分来说,创建自己的使用Activator.CreateInstance和/或反射的托管rundll32非常简单。或者只是一个快速的控制台应用程序,这实际上并不需要jet pack。@Hans:当然,你是对的。这真的很简单——不过,我的问题的关键是,这是否也是绝对必要的。我想,现在我知道了通过在命令行中调用
rundll(32).exe您的“dll”名称、您的“entry”点
,或者通过启动一个进程来运行本机dll x86或x64,如下面的C“code.quot中所述:“在一个新进程中”。)PowerShell可能会成功。只有一个问题:它是包含在每个Visual Studio 2010安装中,还是单独安装?不知道Powershell是否随Visual Studio一起安装。它是Windows 7和Windows 2008的一部分。“将其包装成一个.exe/.ps1应该不难,您可以从命令行上的某个选项开始”我知道该选项。我特别想问的是有没有其他办法?你的答案似乎是否定的。如果在接下来的几个小时内没有其他人提供解决方案,我会接受。如果你——我不知道……,Powershell可能真的很酷实际上,提供在一个新的(希望是隐藏的!)进程中启动powershell的代码——然后实际执行代码来实现这一点……这是.NET,而不是本机dll。对于创新方法,这是+1。我以后会记住这一条的!:)InstallUtil是.NET的一部分,因此它应该可以在任何可以运行程序集的地方使用;PowerShell没有得到保证(例如,Windows XP)。还应明确将运行哪个版本的框架。:)MSBuild内联任务XML文件中的C#代码段,在内存中编译和执行