将非托管EXE作为资源嵌入到托管C#代码中

时间:2012-03-05 16:43:36

标签: c# c++ .net unmanaged

我有一个用非托管C ++编写的代码,我在C#程序中添加了一个资源。

当尝试使用Assembly.Load加载非托管EXE时,我得到一个BadImageFormatException,其内部异常表示" IL格式不正确" (显然)。

我该如何做到这一点?

我知道将代码用作DLL会更好,但出于某种原因,dll调用的行为与我使用System.Diagnostics.Process.Start运行非托管exe时的行为方式不同。

而且我不想要两个分开的EXE文件。有什么想法吗?


编辑:好的,我不再需要这样做了。我的dll表现不同,因为我在不同的上下文中使用它(winform而不是console);因此导致问题的函数SetThreadDesktop无法按预期工作。现在关闭帖子,感谢所有回答的人。

3 个答案:

答案 0 :(得分:3)

您无法使用Assembly.Load()加载非托管的exe / dll,它只适用于托管的版本。如果您需要在该非托管文件上进行PInvoke,并且您希望单个exe只是部署的原因,您可以将其打包为嵌入式资源(如您当前所做)并在目标计算机上解压缩文件,并将其用作通常。

答案 1 :(得分:2)

如果您有非托管DLL作为资源 - 基本步骤:

答案 2 :(得分:0)

可以自动化的略有不同的方法是使用所谓的"组装编织" Costura.Fody - https://github.com/Fody/Costura - 是编织者中的一个'。嵌入过程(带有测试自动化),用于合并非托管资源并在运行时透明地加载它们,而无需花费太多精力 -

Install-Package Fody.Costura

然后,默认情况下,所有嵌入,拆包,装配定位和加载都是自动进行的,并且通过包含' FodyWeavers.xml'配置,添加到您的项目中。

  

<Costura> <Unmanaged32Assemblies> Foo32 Bar32 </Unmanaged32Assemblies> <Unmanaged64Assemblies> Foo64 Bar64 </Unmanaged64Assemblies> </Costura>

方法背后的概念是静态<Module>类加载器,在成功构建项目程序集之后,由Fody项目任务进行二进制更改。内部Mono.Cecil用于静态'<Module>'加载器注入,它自动解压缩资源,将它们保存到临时目录,告知在程序集加载事件时从该位置加载dll等。

相关问题