【问题标题】:Calling C++ LINK from a csproj in VS2008在 VS2008 中从 csproj 调用 C++ LINK
【发布时间】:2011-10-12 09:35:42
【问题描述】:

我有兴趣将单个 .cpp 文件(包含本机代码和托管代码)合并到一个更大的 C# 项目中。我不想为 CPP 代码使用单独的 DLL,因为仅仅因为几行代码“浪费”整个 DLL 似乎很愚蠢,而且因为代码具有一些我更愿意混淆的安全功能将其隐藏在更大的程序集中。 (在有人建议之前,我不能使用 ILmerge 或 AL,因为它们不适用于本机代码。)

编译一个 .cpp 和一组 .cs 文件的基本过程已经介绍过几次了;主要的候选人建议似乎是:

然而,这两个(以及我能找到的所有相关链接)都只处理在命令行上构建。

我更愿意更改我现有的 .csproj 文件以在 C++ 代码中编译和链接(我不介意 C++ 构建本身位于单独的 .vcproj 中,虽然如果不是更好,但链接必须在.csproj),并使其全部可在 VS2008 中构建,因此项目用户无需知道其中的区别。

不幸的是,我似乎无法从 VS 编译的 .csproj 中成功调用 link.exe。带有“link”的“Exec”元素找不到可执行文件,因为它不在 PATH 中。显式指定位置 ("$(DevEnvDir)....\VC\bin\link") 确实开始运行它,但它立即失败并显示错误代码,表明它无法加载它需要的库(大概是因为再次,它不在 PATH 中)。

是否有任何从 Visual Studio 中的 csproj 成功调用 LINK 的示例?


编辑:好的,我现在已经设法解决了这个问题,一切都在编译、链接和运行良好——在发布模式下。它似乎在调试模式下运行正常,但由于某种原因,它的 SxS 清单(LINK 生成但我必须通过mt 手动应用)仅指发布 CRT,而不是 DebugCRT。任何想法如何解决这个问题?

【问题讨论】:

  • 是的,您必须使用 set path=%path%;etcetera 设置路径。更严重的障碍是 IDE 不允许您指定 /module 编译选项。你必须破解 msbuild。
  • 我想过这样做,但我无法找出正确的语法来做到这一点(在 Exec 元素内部或外部)。我不想为此创建一个批处理文件,这看起来很笨拙。我试图做到这一点的方式是覆盖 CoreCompile 目标;到目前为止,这似乎奏效了。这算不算破解 msbuild?
  • (编辑发生在这里,所以上面的讨论不再适用)

标签: .net visual-studio msbuild linker csproj


【解决方案1】:

当您使用 Debug 配置构建的 obj 和 lib 文件进行链接时,它应该引用 DebugCRT。

你的命令行是什么样的?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多