选项 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/Invoke 静态类方法
2016 年编辑:现在是 Nuget 包:UnmanagedExports ( src )!
未知的 MSIL 指令(msdn 论坛,2007)链接到 IL 汇编语言程序员参考(10/3/2000,pg.74)的 beta 1 版本,其中指出:
如果指定了fromunmanaged,则运行时会自动生成一个thunk,它将非托管方法调用转换为托管调用,调用该方法,并将结果返回给非托管环境。
Expert .NET 2.0 IL assembler和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 导出(单声道,2011)
没有 C++/CLI 的简单 DLL 导出方法(codeproject,2009) - 不支持 64 位?
如何自动将 .NET 函数导出到非托管程序(codeproject,2006)- 支持 64 位
.Net 4.0 中是否添加了任何内容以支持“反向 P/Invoke”方案?(msdn 论坛,2010 年)- 代码清单
非托管代码可以包装托管方法(codeproject,2004)
潜在的缺点:
反向 Pinvoke 的陷阱(非托管到托管代码回调)(msdn 博客,2006 年)
反向 P/Invoke 和异常(msdn blog, 2008)