如何使用 C++ 非托管库在 Visual Studio 2017 中为 Xamarin.Forms 设置项目?

Posted

技术标签:

【中文标题】如何使用 C++ 非托管库在 Visual Studio 2017 中为 Xamarin.Forms 设置项目?【英文标题】:How to setup project in Visual Studio 2017 for Xamarin.Forms with C++ unmanaged library? 【发布时间】:2018-03-31 03:15:09 【问题描述】:

我的项目针对 androidios 平台。

我需要创建一个本机 C++ 库(便携式)、一个围绕 C++ 库的 C# 包装器库 (dll),最后是使用这些库的 Xamarin.Forms 演示应用程序。 原生库和包装库是可交付的,演示应用用于概念验证。

我完整安装了 Visual Studio 2017,但似乎找不到正确设置所有引用的项目类型的正确组合。

我应该如何在 Visual Studio 2017 中进行设置?

我不介意设置大量项目。我主要关心的是尽可能多地共享代码。

【问题讨论】:

您是否考虑过使用 C++/CLI 项目?听起来是适合这项工作的工具。 我读到移动开发不支持 C++/CLI,所以我只能使用 p/invoke。我设法使用 p/invoke 从 Xamarin.Forms 应用程序调用本机代码。我遇到的问题是创建一个托管类库,它将 p/invoke 代码整齐地包装在一个 dll 中。 VS2017中的项目模板似乎都不起作用,或者我做错了...... hmm ,Visual Studio 2015/2017 中有一个跨平台 C++ 项目类型...不确定包装器的目标是什么,但这个人有正确的想法github.com/lothrop/XamarinNative @Pat,如果您可以使用 COM 互操作,那里有免费工具可以为您的C++ dll 创建一个托管包装 dll。我不知道移动平台是否会支持它,但值得一试,因为它不会花费很长时间。查看this article 了解一些基本信息。如果您认为这可行,我可以为您提供更多详细信息。 【参考方案1】:

为每个平台编译您的 C++ 库(例如使用 clang/gcc)。这应该在 Android 上提供一个 mylib.so 和一个 mylib.dylib(或者如果你打算将它推送到 App Store 上,则提供 mylib.framework)。您的 C++ 应该使用 extern C 来公开 API。这部分与 VS 模板/项目无关,您只需要正确的二进制文件。

创建一个 .NET 标准 2.0 库项目。使用<TargetFrameworks>MonoAndroid8.1;Xamarin.iOS10;netstandard2.0</TargetFrameworks> 使用多目标bu。如果您需要有关设置的示例,请在 GitHub 上查找跨平台项目。您的 C# 代码将使用 P/Invoke 调用 C++ 并处理编组以公开 C# 友好的 API。同样,请参阅 GitHub 上流行库的包装器。

然后你需要创建一个 Xamarin.Forms 项目,其中包含 3 个项目:

1 个共享程序集,包含所有共享代码和视图,并引用您的 .NET Standard 库项目。 1 个 iOS 项目,它引用上述共享 Xamarin.Forms 项目,并具有包含 C++ 代码的 dylib/framework 的本机引用。 1 个 Android 项目,它引用了上述共享 Xamarin.Forms 项目,并具有包含 C++ 代码的 .so 二进制文件的本机引用。

【讨论】:

以上是关于如何使用 C++ 非托管库在 Visual Studio 2017 中为 Xamarin.Forms 设置项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual C++ 中将托管变量用作全局变量?

Visual Studio 非托管 C++ 智能文件资源管理器

持续集成:Visual Studio 2008 上的非托管 C++

Visual Studio 2008 Profiler 是不是适用于非托管 C++?

Visual Studio 2008 中的非托管 C++ 单元测试

静态代码分析器:非托管C ++ Visual Studio 2008