首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有可能在没有可执行文件的情况下执行.NET动态链接库?

有没有可能在没有可执行文件的情况下执行.NET动态链接库?
EN

Stack Overflow用户
提问于 2011-03-02 23:56:06
回答 5查看 17.9K关注 0票数 24

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

AFAIK,这对于本机Win32/64 DLL是不可能的。.NET动态链接库程序集怎么样?

UPDATE:我忘了提一下,我主要对以编程方式(具体地说是通过C#代码)完成这项工作感兴趣。

谢谢!

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

再次感谢所有加入的人!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-03 00:01:09

只需启动一个PowerShell提示符。

代码语言:javascript
复制
  [Reflection.Assembly]::LoadFile("Name of your dll")
  [Your.NameSpace.And.TypeName]::YourMethod()

我知道你想从C#那里得到这个

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

代码语言:javascript
复制
 var t = Type.GetType("NameSpace.Type,Name Of Dll");
 var m = t.GetMethod("NameOfMethod");
 m.Invoke(null, new object[] { params });

这应该可以让你开始学习了。

我不太清楚您所说的“在新进程中”是什么意思,但是将其封装到.exe/.ps1文件中并不难,这样您就可以在命令行中使用一些选项开始。

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

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

票数 17
EN

Stack Overflow用户

发布于 2011-03-10 05:40:57

选项1:.NET InstallUtil (正常.NET安装的一部分)

添加对System.Configuration.Install的引用,然后将类似以下内容放入程序集中:

代码语言:javascript
复制
[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:

代码语言:javascript
复制
%windir%\Microsoft.NET\Framework\v2.0.50727\installutil /logtoconsole=false /logfile= /u [your assembly .dll here]

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

选项2:使用原生rundll32来反转P/调用静态类方法

2016编辑: Now a Nuget package:UnmanagedExports (src)!

Unknown MSIL directives (msdn论坛,2007)链接到IL汇编语言程序员参考(10/3/2000,pg.74)的beta 1版本,该版本声明:

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

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

相关阅读:

Unmanaged Exports: Cannot compile assembly (堆栈溢出,2010)

Unmanaged Exports / RGiesecke.DllExport.dll (堆栈溢出,2010)

Create a C# DLL That Can Be Imported in a Delphi App Using stdcall (堆栈溢出,2009)

C# Project Template for Unmanaged Exports (Robert Giesecke,2010) - msbuild,vs2010集成

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

Simple Method of DLL Export without C++/CLI (代码项目,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论坛,2010) -代码列表

Unmanaged code can wrap managed methods (codeproject,2004)

潜在的缺点:

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

Reverse P/Invoke and exception (msdn博客,2008)

票数 13
EN

Stack Overflow用户

发布于 2011-03-03 00:01:29

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5170019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档