生成一个CIL可执行文件而不是EXE,然后执行它。

3
我有一个生成EXE文件的C#项目。现在,我处于一个“安全”的企业环境中,可以编译我的项目,但无法执行EXE文件。 作为一名Java程序员,我想知道是否有一种方法将C#项目编译成不是EXE文件而是CIL文件,然后通过在dotnet世界中对应于java.exe的东西来执行CIL文件。 根据评论进行的编辑: 1. 我可以运行由包管理器安装的exe文件 2. 是的,我知道企业政策很愚蠢。

3
你无法运行exe文件?那你怎么进行任何操作呢? - Jonny
6
你可以解决这个问题,但是你不应该这样做。向组织解释,在存在荒谬的环境限制下,你无法完成工作。请注意在翻译过程中保持原文意思,并使语言更通俗易懂。 - CodeCaster
3
我认为我们公司屏蔽YouTube很不好。 - artm
4
那么你无法使用C#开发软件。我会问我的老板,而不是在这里寻求帮助。 - Patrik
5
一个解决办法是考虑辞职。 - Ondrej Tucny
显示剩余8条评论
1个回答

5

这应该很容易。

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

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

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。这并不经常使用,因此不应该成为问题。由您自己构建要运行的应用程序的许多类似问题也应该没问题。

2
哪个可执行文件将运行 Assembly.Load("SomeExe.exe")?OP 无法在他的环境中运行任意可执行文件。你将如何调试 SomeExe.exe?你将如何从 Visual Studio 启动它? - CodeCaster
1
@CodeCaster 任何允许您执行某些C#代码的应用程序。而且很容易调试 SomeExe.exe,也可以从VS自动启动它。 - Luaan
2
谢谢大家。我现在要尝试一下这个。供您参考,我也已经开始正式的程序来消除障碍。 - David Vonka
1
好的,涉及到的机器上已经安装了PowerShell - 不需要要求任何人安装任何东西,这对于LinqPad来说可能是个问题。我启动了PowerShell并输入了[Reflection.Assembly] :: LoadFrom(“c:\ users \ ..... \ bin \ Debug \ mstr.exe”),然后响应是BadImageFormatException和一个文本错误消息,说明我尝试以错误的格式加载某些内容。 - David Vonka
1
最终我实际上调用了 [Namespace.Classname]::Main() 而不是使用invoke结构。 - David Vonka
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接