在同一解决方案中从 c# 项目到 c++ 项目的 DllImport

Posted

技术标签:

【中文标题】在同一解决方案中从 c# 项目到 c++ 项目的 DllImport【英文标题】:DllImport from c# project to c++ project in same solution 【发布时间】:2020-01-26 22:53:06 【问题描述】:

我有两个项目的解决方案:

C# 控制台应用程序 (.NET Core 3.1) 和 C++ 动态库 (.dll)

我需要使用 DllImport 从 C# 项目调用 C++ DLL。当我提供 DLL 的完整路径时,应用程序会找到它。但是我想把路径换成相对路径,不知道怎么做。

【问题讨论】:

dll 需要与 c# 应用程序位于同一文件夹中。通常我使用添加现有项目:浏览到 c++ dll 的位置。编译时c#dll会自动复制到c#项目的bin文件夹中。 @jdweng 谢谢,这正是我要找的,我还在“复制到输出目录”属性中将其标记为“始终复制” 请注意,这将始终选择相同的 dll,即使您切换构建(例如,从调试到发布)。 【参考方案1】:

首先,使 C++ 项目成为 C# 项目的依赖项。如果 C# 项目过时,这可确保 C++ 项目将在 C# 项目之前构建。您可以在solution设置中设置项目依赖关系。

既然我们确保了 dll 始终是最新的,我们必须以某种方式将它与 C# 可执行文件放在同一个目录中。我们有两种选择:

    构建后命令将 dll 复制到 C# 项目的输出目录,或 我们将两个项目的输出目录设置为同一目录。

构建后事件

我们可以简单地使用复制命令。转到 C++ 项目设置 > 构建事件 > 构建后事件 并将以下命令复制到 命令行 字段:

xcopy /y "$(OutDir)*.dll" "$(SolutionDir)MY_CSHARP_PROJECT_NAME\bin\$(Platform)\$(Configuration)"

MY_CSHARP_PROJECT_NAME 替换为您的C# 项目的名称。我在这里使用默认路径,根据您的解决方案,您可能需要稍微调整路径。

共享构建目录

我不会推荐这个,因为你可能会遇到麻烦。

    转到 C# 项目的项目设置中的 Build 选项卡。 在页面顶部选择 Debug 作为配置。 在页面底部更改 输出路径 以匹配 Debug 构建的 C++ 输出目录(此目录通常与解决方案文件位于同一文件夹中)。 重复 2 和 3,但这次使用 Release 而不是 Debug

【讨论】:

很好的解释,在我的情况下仍然添加 dll,因为现有项目是更合适的解决方案

以上是关于在同一解决方案中从 c# 项目到 c++ 项目的 DllImport的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 C# 中从本机 C++ 类创建变量?

如何在 c++ 中调用 c# 方法?

cv::VideoCapture 在 C# 项目中从 DLL 使用时不会打开文件或流

解决方案中从一个项目到另一个项目的数据传输

在 C# 中从项目的资源区域加载图像

如何将 .exe 从 C++ 项目复制到 C# 项目的输出目录?