生成CIL可执行文件而不是EXE然后执行它

时间:2015-05-07 10:57:12

标签: c# .net cil

我有一个生成EXE文件的c#项目。现在,我在"安全"公司环境,我可以编译我的项目,但我无法执行EXE文件。

作为一名Java程序员,我想知道是否没有办法将c#项目编译成不是EXE文件的东西,而是CIL文件然后通过对应的东西执行CIL文件dotnet世界中的java.exe。

编辑回应评论:

  1. 我可以运行由程序包管理器安装的exe文件
  2. 是的,我知道公司政策很愚蠢。

1 个答案:

答案 0 :(得分:4)

嗯,这应该很容易。

.NET可执行文件就像其他任何DLL一样 - 主要的区别在于可执行格式本身,以及EXE文件有入口点,而DLL没有。

这也意味着您可以将EXE加载到内存中,就像使用DLL一样:

Assembly.LoadFrom("SomeExe.exe");

你已经到了一半 - 现在我们只需找到并执行入口点。毫不奇怪,这非常简单:

var assembly = Assembly.LoadFrom("SomeExe.exe");
assembly.EntryPoint.Invoke(null, null);

对于大多数应用程序,这应该完全正常;对于某些人,您必须确保您用来调用入口点的主题分别为STAThreadMTAThread Thread.TrySetThreadApartment开始一个新线程。)

某些应用程序可能需要调整,但它不应该太难修复。

所以你可以制作一些只包含这两行代码的引导应用程序("解释器")。如果您无法获得批准,并且您确实需要某些东西作为官方软件包,请尝试使用允许您执行任意代码的.NET应用程序 - 例如,LINQPad或PowerShell。

修改

当然,这确实有局限性,它确实引入了一些额外的设置工作:

  • 引导程序必须针对相同或更高版本的.NET Framework。 .NET Portable可能特别棘手,但我认为你可以很好地控制它。它也必须具有相同的位(如果明确指定)。
  • 您需要通过引导程序运行调试。这实际上并不是太难 - 只需转到项目属性,调试并选择"启动外部程序"。
  • 引导程序必须在完全信任条件下运行 - 这是反射工作所必需的。在大多数系统上,这只是意味着您必须将exe作为本地文件(例如,不是来自网络共享)。 LINQPad等工具默认情况下将完全信任。
  • 申请表不得依赖Assembly.GetEntryAssembly。这并不是经常使用的,所以它不应该是一个问题。相当多的类似问题也应该没问题,因为你构建了自己试图运行的应用程序。