将非托管EXE作为资源合并到托管C#代码中
Incorporate an unmanaged EXE as resource in a managed C# code
我有一个用非托管C++编写的给定代码,我将其作为资源添加到C#程序中。
当尝试使用Assembly.Load
加载非托管EXE时,我得到了一个BadImageFormatException
,其InnerException表示"IL格式不正确"(显然)。
我怎样才能做到这一点?
我知道将代码用作DLL会更好,但由于某些原因,DLL调用的行为与使用System.Diagnostics.Process.Start
运行非托管exe时不同。
我不想有两个单独的EXE文件。知道吗?
编辑:好的,我不再需要这么做了。我的dll的行为方式不同,因为我在不同的上下文中使用它(winform而不是控制台);因此,导致问题的函数SetThreadDesktop
无法按预期工作。现在就要结束帖子了,感谢所有回复的人。
您不能用Assembly.Load()
加载非托管的exe/dll,它只能与托管的一起工作。如果您需要在该非托管文件上PInvoke,而您想要单个exe的原因只是部署,则可以将其打包为嵌入式资源(如当前所做的那样),并在目标计算机上解压缩为一个文件,然后照常使用。
如果您有非托管DLL作为资源-基本步骤:
- 在运行时将资源保存到磁盘
- 使用LoadLibrary(使用PInvoke对LoadLibrary的Win32调用)
- 可以通过调用为PInvoke注释的方法来使用此库中的方法,也可以通过GetProcAddress手动使用
略有不同的方法是使用所谓的"组装编织"Costura Fodyhttps://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等。
- 在实现合并排序代码时无法计算所有反转
- 蝴蝶代码 88.合并排序数组 c++ 运行时错误
- 我的C++合并排序代码不起作用。我在这里错过了什么?
- 合并排序代码中的分段错误
- 我的C++合并排序代码有什么问题?
- 如何使用可执行文件将我的C++代码合并到我的 Xcode 项目中
- 我的合并sort.h文件中的代码出了什么问题
- 如何将用户代码合并到我自己的应用程序中?
- 当我使用此合并排序代码运行时,输出错误
- 在C 中合并代码实现
- 我在合并排序代码中获取垃圾值
- 如何将VideoWriter代码合并到ros image_publisher代码中
- C++合并排序代码中的隔离错误
- 合并排序代码 c++
- 这个合并排序代码出了什么问题
- 将排序代码与数组合并,陷入合并,只需要一点点修正
- Visual Studio 2012 C++代码覆盖率合并可执行文件
- 为什么我的合并排序代码比插入排序慢
- 使合并排序几乎与家庭作业的伪代码相同
- MFC-C代码合并问题