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

本文关键字:交付 应用程序 构建 C++DLL Studio Visual 2013 使用 | 更新日期: 2023-09-27 18:19:27

我是Visual Studio 2013的新手,正试图了解如何在Visual Studio中构建C DLL,然后在C#应用程序中调用C库导出的函数。我已经构建了所有内容,但我不知道如何正确地将DLL包含在应用程序构建中,以便在使用[DLLImport()]时能够正确加载。当前,当我试图从C#类中的库中调用函数时,会得到一个System.DllNotFoundException

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

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

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

MyApp-Win.Windows:Win 8.1的C#项目,该项目希望利用HelloWorldLib.Windows构建生成的HelloWorldLib.Windows.dll

我已经看了很多SO的问题和答案。例如,我认为我的问题与这个问题类似,但似乎没有得到任何有用的回答:互操作、本机DLL和Visual Studio构建过程

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

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

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

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

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

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

  • 更改C++项目的"输出目录"设置
  • 为您的C#项目编写一个使用xcopy.exe复制DLL的生成后事件

不幸的是,事情并没有那么容易,至少现在还没有。我本来打算和微软C++团队开会,但会议被推迟了,我的愿望清单上有你想要的类似功能(为Xamarin.iOS和Android构建托管的C++/CLI包装器)。

目前,如果可以的话,最简单的选择是将C++代码封装在公开C接口的DLL中。然后用XCode和Android NDK构建它。如果不能,那么下一个选项是创建Objective-C绑定项目,将C++代码封装在iOS的ObjectiveC类中。对于Android,创建Java包装器或使用SWIG。这两个选项都很繁琐,这就是为什么C API应该是您调查的首选。

我知道这不是你所希望的答案,但重用C++代码比重用C#甚至C.要复杂得多