【问题标题】:using msbuild to build a C++ project from another C++ project in the same solution使用 msbuild 从同一解决方案中的另一个 C++ 项目构建 C++ 项目
【发布时间】:2013-08-07 06:49:01
【问题描述】:

我在 msdn 中看到许多页面解释如何使用 msbuild 从命令行构建 C++ 项目。但是是否可以使用 msbuild 从另一个 C++ 项目的代码中构建 C++ 项目?

更具体地说:在 C++ 解决方案中,我有 2 个项目(exe、dll)。是否可以通过 msbuild 在运行时从 exe 项目构建 dll 项目,然后加载 dll 并调用 dll 的函数之一?

我需要这个,因为我需要在运行时更改 dll 项目的代码、构建它并在运行时调用它的函数。

我们将不胜感激。

【问题讨论】:

  • “运行时”是什么意思?以及如何/在哪里更改 dll 代码,以及如何在哪里调用它?
  • 要更改 dll 代码,我的意思是在 dll 项目中的类中添加方法签名和实现。在运行时,我的意思是在 exe 运行期间。 exe 是一个 MFC 应用程序,它要求用户提供要测试的源文件,其中包含一个 C++ 函数。为了测试这个函数,我将它复制到我的 dll 项目类中的一个文件中,并将它的签名添加到类头中。然后我从我的 dll 项目中的另一个函数添加对该函数的调用。然后我需要调用它来测试用户代码的行为。所以我需要在运行时构建 dll。
  • 好的,如果我理解正确的话,您想从 MFC executable 中构建 dll 项目,而不是从 MFC project 中构建 dll 项目?只需像在命令行上一样使用正确的参数启动 msbuild 进程,对吗?
  • 是的。我想从我的 MFC 可执行文件中构建 dll 项目。 dll的项目与exe项目在同一个解决方案中,dll构建后会被exe加载。

标签: visual-c++ compilation msbuild projects-and-solutions


【解决方案1】:

只需调用 CreateProcess,例如(使用 msbuild 4):

#include <windows.h>
#include <string>
#include <iostream>

bool RunMsBuild( const char* args )
{
  STARTUPINFO startupInfo;
  PROCESS_INFORMATION procInfo;
  memset( &startupInfo, 0, sizeof( startupInfo ) );
  memset( &procInfo, 0, sizeof( procInfo ) );

  std::string cmdLine( "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\MSBuild.exe " );
  cmdLine += args;

  if( !CreateProcessA( 0, const_cast< char* >( cmdLine.c_str() ),
        0, 0, FALSE, 0, 0, 0, &startupInfo, &procInfo ) )
    return false;
  WaitForSingleObject( procInfo.hProcess, INFINITE );
  DWORD dwExitCode;
  GetExitCodeProcess( procInfo.hProcess, &dwExitCode );
  CloseHandle( procInfo.hProcess );
  CloseHandle( procInfo.hThread );
  return dwExitCode == 0;
}

int main()
{
  if( RunMsBuild( "full\\path\\to\\ptojectfile /t:Build" ) )
    std::cout << "ok";
  else
    std::cout << "not ok";
  std::endl;
}

【讨论】:

  • 谢谢,我试试。它只在第一次工作正常:一旦构建了 DLL,我通过 LoadLibrary 加载它,然后我调用它的方法,然后我通过 FreeLibrary 释放它。现在我更改了 dll 代码(向 dll 项目中的类添加一个函数),我再次执行相同操作:构建加载调用和释放,但在第二次构建时失败。
  • 我不确定 FreeLibrary 是否足以删除 dll 的所有句柄 - 在调试器下运行您的 exe(在 VS 中按 F5),然后在 Modules 窗口中查看检查您的 dll 何时加载和卸载。
  • 谢谢,我检查了这个。 dll 从模块窗口中加载和卸载。第二次还是失败了。如何删除dll的所有句柄?除了调用 FreeLibrary 还能做什么?
  • 如果它不在模块窗口中,我会说它不是由您的 exe 加载的。因此,如果它仍然无法访问,您必须弄清楚 esle 正在访问它,例如 techsupportalert.com/content/…
  • 不知道,可以是任何东西。尝试制作一个简单的复制案例并发布一个新问题。
猜你喜欢
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多