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

aov*_*ven 24 .net assemblies createprocess

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

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

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

谢谢!

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

再次感谢所有插话的人!

GvS*_*GvS 15

只需启动PowerShell提示符即可.

  [Reflection.Assembly]::LoadFile("Name of your dll")
  [Your.NameSpace.And.TypeName]::YourMethod()
Run Code Online (Sandbox Code Playgroud)

我看到你想要来自C#

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

 var t = Type.GetType("NameSpace.Type,Name Of Dll");
 var m = t.GetMethod("NameOfMethod");
 m.Invoke(null, new object[] { params });
Run Code Online (Sandbox Code Playgroud)

这应该让你开始.

我并不完全知道"在一个新的进程中"是什么意思,但不应该将它包装成.exe/.ps1,你可以从命令行上的某个选项开始.

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

但是,如果要启动新进程,则应启动新进程,这通常通过启动新的.EXE来完成.

  • "它不应该很难将它包装成.exe/.ps1,你可以从命令行上的某个选项开始"我知道这个选项.我特别问是否还有其他方法?你的答案似乎是否定的.我会接受,如果没有其他人在接下来的几个小时内提供解决方案. (2认同)

use*_*430 12

选项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...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后滥用.NET InstallUtil:

%windir%\Microsoft.NET\Framework\v2.0.50727\installutil /logtoconsole=false /logfile= /u [your assembly .dll here]
Run Code Online (Sandbox Code Playgroud)

它可能有点乱,特别是没有所有命令行参数禁用日志记录.

选项2:使用native rundll32反向P/Invoke静态类方法

2016编辑:现在一个Nuget包:UnmanagedExports(src)!

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

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

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

相关阅读:

非托管导出:无法编译程序集(stackoverflow,2010)

非托管导出/ RGiesecke.DllExport.dll(stackoverflow,2010)

使用stdcall创建可以在Delphi应用程序中导入的C#DLL(stackoverflow,2009)

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 forum,2010) - 代码清单

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

潜在的缺点:

陷入反向Pinvoke(未托管到托管代码回调)(msdn blog,2006)

反向P/Invoke和异常(msdn blog,2008)

  • +1创新方法.我会记住这个未来!:) (2认同)