c# - 使用 Visual Studio 2013 构建 C/C++ DLL 并将其交付到 C# 应用程序中

标签 c# visual-studio visual-c++ dll xamarin

我是一名 Visual Studio 2013 新手,正在尝试了解如何在 Visual Studio 中构建 C DLL,然后从 C# 应用程序中调用 C 库导出的函数。我已经构建了所有内容,但我无法找出将 DLL 包含在应用程序构建中的正确方法,以便在使用 [DLLImport()] 时它实际上会正确加载。我目前在尝试从我的 C# 类中调用库中的函数时收到 System.DllNotFoundException

我已经设置了一个 VS 2013 解决方案,其中包含以下项目:

HelloWorldLib.Shared : 包含 DLL 的 .cpp 和 .h 文件的共享项目

HelloWorldLib.Windows : 引用共享项目并为 Win 8.1 构建 DLL 的 Win 8.1 C++ 项目

MyApp-Win.Windows : 适用于 Win 8.1 的 C# 项目想要使用由 HelloWorldLib.windows 生成的 HelloWorldLib.Windows.dll

我一直在查看许多 SO 问题和答案。例如,我认为我的问题与这个问题类似,但似乎没有以任何有用的方式回答: Interop, Native DLL and Visual Studio build process

其他一些答案建议添加对 DLL 的文件引用,但我该怎么做并保持正确的调试/发布版本?鉴于所有这些项目都在同一个解决方案中构建,并且它们之间存在构建依赖关系,感觉应该一种直接的方法来设置它。

顺便说一句,我正在使用共享项目设置,因为我的最终目标是弄清楚如何让这一切与 Xamarin 一起工作以面向 iOS、Win、Win Phone、Mac 和 Android。这样我们就可以为我们的高性能需求代码使用一个通用的 C/C++ 层,并从各种平台上的 UI 层引用它。

最佳答案

这是一个非常简单的问题,如果您查看构建文件的最终位置,就很容易识别。 C++ 构建系统与托管构建系统具有不同的策略。默认情况下,它会将构建输出写入解决方案目录的调试目录。然而,您的 C# 项目构建到其 bin\Debug 目录,并要求所有依赖的 DLL 都存在于该目录中。

因此,默认情况下,您的 C# 程序永远找不到 DLL,它在错误的目录中,而 Windows 不会在那里查找。 MSBuild 也不够智能,无法自行发现这一点,就像它可以发现托管 DLL 一样,它看不到您的程序依赖于 C++ DLL。

解决此问题的两种基本方法:

  • 更改 C++ 项目的输出目录设置
  • 为使用 xcopy.exe 复制 DLL 的 C# 项目编写构建后事件。

关于c# - 使用 Visual Studio 2013 构建 C/C++ DLL 并将其交付到 C# 应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25513392/

相关文章:

c# - 具有非特定属性值的 mvcSiteMapNode

c# 加载大量图像时出现内存不足异常

c++ - 前向声明从嵌套模板中隐藏祖先模板参数

c# - C#中的属性

c# - Mono.Cecil - 如何获取自定义属性

visual-studio - 在 Visual Studio 和 Team Foundation Server 中重命名项目文件夹

visual-studio - 在 Visual Studio 2019 中更改 docker 组合名称

c++ - 泛化一个函数

c - Sonar C 插件——包含文件中的解析器错误

c# - BAL 中的依赖注入(inject)而不添加对 DAL 的项目引用