将托pipe程序合并到非托pipeC ++可执行文件中

我的目标是只有一个可执行文件。

  • 是否有可能将托pipe的.exe文件合并到非托pipe的.exe文件中?

有很多关于做事情的信息(将非托pipe代码合并到一个托pipe项目中),但是我还没有find任何有关其他方向的信息。

背景:

这是一个系统要求/兼容性检查器。
我在.NET 2中使用C#编写了大部分代码。
但是,只有在确定系统至less安装了.NET 2的情况下,该部分才会运行。
这就是“DotNetVersionIdentifier.exe”的作用。
不pipe是否安装了.NET Framework,它都将运行非托pipe代码 。 如果安装了.NET 2.0或更高版本,我已经修改了运行我的C#程序的代码,而不是显示已安装的.NET版本的对话框,或者报告自定义消息。

  • 我想将C#程序打包到C ++可执行文件中,这样我只需要分发一个.exe文件

我已经尝试使用ILMerge,但由于我的非托pipe代码不能编译成中间语言,它崩溃…

ILMerge不接受非托管代码...

我可以将我的C#项目添加到C ++解决scheme,但它仍编译为两个单独的可执行文件。

这种方法: 如何将数据附加到.EXE文件的结尾听起来像一个迷人,但过时的黑客。

这个想法似乎可能工作: 如何embedded一个exe文件作为一个资源,然后启动它 ,现在我正在调查它。

我设法通过使用资源完成我的目标, 如下所述 。

以下是我如何使其工作。 (我是C ++的新手,所以如果你看到任何愚蠢,请告诉我)

  • 将托管代码编译为单个文件
  • 将托管代码可执行文件重命名为.txt
  • 创建一个新的Visual C ++ Win32控制台应用程序
  • 添加新项目 – 资源文件(.rc)
  • 打开资源文件,添加资源,选择导入 ,输入“TEXT”作为类型
  • 修改“DWORD大小”以匹配托管的.txt文件的大小

其余的可以用代码转储来解释。
希望这将有助于某人(像我这样的C ++新手…)

#include "stdafx.h" #include "resource.h" #include "windows.h" #include "iostream" #include <string> #include <sstream> using namespace std; namespace std { HRSRC hrsrc = NULL; HGLOBAL hGlbl = NULL; BYTE *pExeResource = NULL; HANDLE hFile = INVALID_HANDLE_VALUE; DWORD size = 8192; //hardcoding the size of the exe resource (in bytes) HINSTANCE g_Handle = NULL; HINSTANCE hInstance = NULL; // Passing NULL uses the instance that started the process( CSMerged.exe ). template <typename T> string NumberToString(T pNumber) { ostringstream oOStrStream; oOStrStream << pNumber; return oOStrStream.str(); } } int _tmain(int argc, _TCHAR* argv[]) { hrsrc = FindResource(GetmoduleeHandle(NULL), MAKEINTRESOURCE(IDR_TEXT1), _T("TEXT")); if (hrsrc == NULL) { cout << "hrsc is null! \n"; cin.get(); // leave the console open. return FALSE; } hGlbl = LoadResource(hInstance, hrsrc); if (hGlbl == NULL) { cout << "hGlbl is null! \n"; cin.get(); // leave the console open. return FALSE; } pExeResource = (BYTE*)LockResource(hGlbl); if (pExeResource == NULL) { cout << "pExeResource is null! \n"; cin.get(); // leave the console open. return FALSE; } hFile = CreateFile(L"ManagedCode.exe", GENERIC_WRITE | GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { DWORD bytesWritten = 0; WriteFile(hFile, pExeResource, size, &bytesWritten, NULL); CloseHandle(hFile); } PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); int ret = CreateProcess(L"ManagedCode.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); if (ret == 1) { return 0; } // the process started successfully, so I'm done here. else { cout << "CreatePrecess returns " + NumberToString(ret) + ". \n"; cin.get(); // leave the console open } return 0; } 

Resource.h – 这是自动生成的,以及在使用VS2013的GUI导入资源时对Recource.rc的修改。

 //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by Resource.rc // #define IDR_TEXT1 101 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif 

我应该添加一些其他的东西,我必须改变,使其在Windows XP上运行:

  • 确保平台目标是Win32
  • 将“ 配置属性”>“常规”>“平台工具集 设置为“Visual Studio 2013 – Windows XP(x120_xp)”
  • 配置属性> C / C ++>代码生成>运行时库设置“多线程(/ MT)