【问题标题】:How can I build a native DLL as part of a .NET build process?如何在 .NET 构建过程中构建本机 DLL?
【发布时间】:2017-02-09 00:25:47
【问题描述】:

我正在用 C# 构建一个项目以与 C++ 库交互。因为我希望这是跨平台的,所以我使用的是 .NET Core RC3,但我不确定这是否相关。

现在我的项目中有 cpp 文件,并且我有一个 PreBuildEvent 之类的

<PreBuildEvent>
   gcc -c -fPIC -std=c++11  "$(SolutionDir)ProjectName\cfile.cpp" -o"$(SolutionDir)ProjectName\cfile.o"
  gcc -shared -o "$(SolutionDir)ProjectName\cfile.dll" "$(SolutionDir)ProjectName\cfile.o" -lstdc++
</PreBuildEvent>

DLL 被构建,然后复制到输出目录。然后我使用 PInvoke 与之通信。

这部分有效。然后我添加一个引用第一个项目的测试项目。不起作用的部分是当我尝试做dotnet test 时。

然后它说

gcc : error : ProjectName\cfile.cpp: No such file or directory

我猜$(SolutionDir) 在这种情况下一定不能设置,或者其他什么。

如果我将项目更改为命令行应用程序,然后执行 dotnet run 也不起作用。

$(ProjectDir) 在这种情况下似乎在PreBuildEventPostBuildEvent 中都不可用。

最好的设置方法是什么?

【问题讨论】:

  • 您的预构建事件位于项目文件中,该文件可能具有相对于解决方案的固定位置(否则您将无法首先使用 SolutionDir)。因此,请指定相对于 $(ProjectDir) 的 cpp 文件的路径。
  • 由于某种原因,$(ProjectDir) 在构建前和构建后事件中都没有计算结果。
  • 如果我将项目更改为控制台应用程序并尝试对其执行dotnet run,也会出现此问题。

标签: .net msbuild .net-core


【解决方案1】:

看起来应该改用$(MSBuildProjectDirectory)... When does MSBuild set the $(ProjectName) property?

这似乎适用于在 Visual Studio 和命令行中构建、测试和运行的所有组合。

【讨论】:

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