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

时间:2014-08-26 19:06:07

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

我是一名Visual Studio 2013新手,他试图弄清楚如何在Visual Studio中构建C DLL,然后在C#app中调用C lib导出的函数。我已经完成了所有工作,但我无法弄清楚使用应用程序构建中包含DLL的正确方法,以便在使用[DLLImport()]时实际加载它。当我尝试从我的C#类中调用库中的函数时,我当前得到System.DllNotFoundException

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

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

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

MyApp-Win.Windows: 想要利用HelloWorldLib.windows构建生成的HelloWorldLib.Windows.dll的Win 8.1的C#项目

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

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

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

2 个答案:

答案 0 :(得分:2)

这是一个非常简单的问题,如果您查看构建文件的最终位置,则很容易识别。 C ++构建系统具有与托管构建系统不同的策略。它默认将构建输出写入解决方案目录的Debug目录。但是,您的C#项目构建到其bin \ Debug目录,并且需要所有相关的DLL存在。

因此,默认情况下,您的C#程序永远找不到DLL,它位于错误的目录中,而Windows并不在那里。 MSBuild也不足以发现它本身,就像托管DLL一样,它无法看到你的程序依赖于C ++ DLL。

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

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

答案 1 :(得分:1)

不幸的是,事情并不容易,至少现在还没有。我打算与微软C ++团队开会,但推迟了,你所追求的类似功能是我的愿望清单之一(为Xamarin.iOS和Android构建托管C ++ / CLI包装器)。

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

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