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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (33)

我很好奇,如果有一种方法可以在新流程中执行静态.DLL方法,而无需为它创建.EXE文件?

AFAIK,这对于原生Win32 / 64 DLL是不可能的。.NET DLL组件怎么样?

我主要感兴趣的是以编程方式(从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来完成的。

用户回答回答于

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

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

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

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

相关阅读:

非托管导出的C#项目模板Robert Giesecke,2010) - msbuild,vs2010集成

IKVM.Reflection更新:将静态托管方法导出为非托管DLL导出(mono,2011)

没有C ++ / CLI的DLL导出的简单方法(codeproject,2009) - 没有64位支持?

如何自动将.NET函数导出到非托管程序(codeproject,2006) - 支持64位

是否有任何东西被添加到.Net 4.0中以支持“反向P /调用”方案?(msdn论坛,2010) - 代码清单

非托管代码可以封装托管方法(codeproject,2004)

潜在的缺点:

与反向Pinvoke(非托管托管代码回调)(MSDN博客,2006年)

反向P / Invoke和异常(MSDN博客,2008)

扫码关注云+社区