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

时间:2011-03-02 15:56:06

标签: .net assemblies createprocess

我很好奇是否有办法在新进程中执行静态.DLL方法而不必为它创建.EXE?

AFAIK,本机Win32 / 64 DLL无法实现这一点。 .NET DLL程序集怎么样?

更新:我忘了提及我主要对以编程方式执行此操作感兴趣(来自C#代码,具体而言)。

谢谢!

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

再次感谢所有插话的人!

5 个答案:

答案 0 :(得分:15)

只需启动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来完成的。

答案 1 :(得分:11)

选项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包:UnmanagedExportssrc)!

Unknown MSIL directives(msdn forum,2007)链接到IL汇编语言程序员参考文献的beta 1版本(10/3/2000,第74页),其中指出:

  

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

Expert .NET 2.0 IL assembler Inside Microsoft中有更多细节。 NET IL汇编程序。 (最佳搜索关键词:ilasm vtentry)。

相关阅读:

Unmanaged Exports: Cannot compile assembly(stackoverflow,2010)

Unmanaged Exports / RGiesecke.DllExport.dll(stackoverflow,2010)

Create a C# DLL That Can Be Imported in a Delphi App Using stdcall(stackoverflow,2009)

C# Project Template for Unmanaged ExportsRobert Giesecke,2010) - msbuild,vs2010整合

IKVM.Reflection Update: export static managed methods as unmanaged DLL exports(mono,2011)

Simple Method of DLL Export without C++/CLI(codeproject,2009) - 没有64位支持?

How to Automate Exporting .NET Function to Unmanaged Programs(codeproject,2006) - 支持64位

Has anything been added to .Net 4.0 to support "Reverse P/Invoke" scenarios?(msdn forum,2010) - 代码清单

Unmanaged code can wrap managed methods(codeproject,2004)

潜在的缺点:

Gotchas with Reverse Pinvoke (unmanaged to managed code callbacks)(msdn blog,2006)

Reverse P/Invoke and exception(msdn blog,2008)

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以使用rundll32.exe dll_name,method_name启动进程并运行dll函数。在C#中你可以这样做:

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

确保DLL在您的PATH中。如果您正在考虑运行某种类型的单元测试,请确保在TearDown / CleanUp方法上终止该进程:myProcess.Kill(),否则DLL可能会保持加载状态并且您无法将其覆盖为开发过程的一部分。您还应该查看this article命令行应用程序,该应用程序将终止持有DLL的所有进程并将其添加到预构建事件中:freelib.exe my_dll_name.dll