2012-03-05 35 views
1

我有一个给定的代码以非托管C++编写,我将其作为资源添加到C#程序中。将非托管EXE作为资源合并到受管理的C#代码中

当试图使用Assembly.Load加载非托管EXE时,我得到一个BadImageFormatException,其InnerException表示“IL格式不正确”(显然)。

我该如何做这项工作?

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

而我不想有两个分离的EXE文件。任何想法?


编辑: OK,我不再需要做到这一点。我的dll表现出不同的方式,因为我在不同的环境中使用它(winform而不是控制台);因此导致问题的函数SetThreadDesktop无法按预期工作。现在要关闭帖子,谢谢所有回答的人。

+0

你想使用这个非托管可执行文件?运行?您必须将嵌入式EXE保存到%TEMP%路径,并使用Process.Start来完成。然后使用'WaitForExit',并删除EXE清理。 – vcsjones 2012-03-05 16:51:47

+0

确实是个好主意,但我宁愿在不生成嵌入式EXE的情况下进行此项工作 – GianT971 2012-03-05 17:00:55

+2

您应该能够使用C++/CLI编译器将C++编译为混合模式程序集,并将其与您的C#代码成一个文件。 – 2012-03-05 17:20:27

回答

3

您无法使用Assembly.Load()加载非托管的exe/dll,它只能与托管的exe一起使用。如果您需要对该非托管文件进行PInvoke,并且您希望单个exe的原因只是部署,则可以将其作为嵌入资源打包(如您目前所做的那样),然后在目标机器上解压缩到一个文件中,然后将其作为通常。

+0

好的,但也许有人可以给我一个暗示,使这项工作没有Assembly.Load – GianT971 2012-03-05 16:52:17

+0

@ GianT971我想你已经试图在打包一个exe之前尝试游戏。按照Alexei建议的一些PInvoke教程(+1) – 2012-03-05 17:12:21

+0

请看看这个,明天会给出反馈 – GianT971 2012-03-05 17:19:28

2

如果有非托管DLL作为资源 - 基本步骤:通过调用方法annotated for PInvoke

+0

你是什么意思的“在运行时将资源保存到磁盘”?我该怎么做?* – GianT971 2012-03-05 17:06:35

+0

我们有搜索引擎:) - http://www.bing.com/search?q=Save+resource+to+disk+at+run-time,但这里有一个http ://stackoverflow.com/questions/864140/write-file-from-assembly-resource-stream-to-disk – 2012-03-05 17:09:40

+0

好吧,你认为这样的结果可能会不同,只是将dll导入到项目中? – GianT971 2012-03-05 17:15:21