我很好奇,是否有一种方法可以在新流程中执行静态.DLL方法,而不必为其创建.EXE?
AFAIK,这对于本机Win32/64 DLL是不可能的。.NET动态链接库程序集怎么样?
UPDATE:我忘了提一下,我主要对以编程方式(具体地说是通过C#代码)完成这项工作感兴趣。
谢谢!
结论:虽然没有人“敢”说出来,但答案似乎都倾向于“不”。需要通过一种传统的方法(EXE、PowerShell等)启动进程。然后说服该进程加载DLL并执行其中的代码。我想我错误地希望托管DLL能够做更多的事情。
再次感谢所有加入的人!
发布于 2011-03-03 00:01:09
只需启动一个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文件中并不难,这样您就可以在命令行中使用一些选项开始。
因此,您不必为要调用每个.exe创建新的DLL。
但是如果你想启动一个新的进程,你应该启动一个新的进程,这通常通过启动一个新的.EXE来完成。
发布于 2011-03-10 05:40:57
选项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编辑: 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)
发布于 2011-03-03 00:01:29
查看windows附带的rundll32.exe程序。如果您知道有关dll的某些信息,则有时可以使用此程序运行该dll中的代码。
https://stackoverflow.com/questions/5170019
复制相似问题