另一个项目是一个消耗这些C#绑定的Xamarin Forms项目。我的Xamarin项目的UWP部分没有问题,在NuGet包中找到本地库。然而,Android项目无法找到它。实际上,打开APK文件后发现本地.so文件从未被包含进去。
我正在使用NuGet的机制来包含特定架构库,通过在
/runtimes/platform-arch/native/
文件夹中包含每个平台特定的.dll或.so文件。对于绑定项目,我的文件夹结构如下:
我能确认在生成的.nupkg
文件中,文件夹结构得到了正确保留,其中在包的根目录下有一个runtimes
文件夹和一系列子文件夹。我使用内置的.csproj机制生成NuGet包,没有使用任何.targets文件。我的NuGet项目的csproj如下:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<Version>1.0.5.1</Version>
<Company />
<Product />
</PropertyGroup>
<ItemGroup>
<Content Include="runtimes\**" PackagePath="runtimes">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="OneOf" Version="2.1.150" />
</ItemGroup>
</Project>
我的项目的第二部分是一个Xamarin Forms项目,我将NuGet包导入到项目的.NET Standard跨平台部分中。
当我构建UWP项目时,我的平台特定的.dll文件被正确地复制到我的.appx文件的根目录中,并且我可以成功地P/Invoke它。(我注意到这只有在我使用x64配置进行构建时才有效,并且我正在x64机器上编译。)然而,在构建Android项目时,没有类似的事情发生在.so Android库中。
整个依赖链看起来像这样:
-------------NuGet Package----------
| - native_lib.so |
| - (other runtime dlls, etc) |
------------------------------------
^
|
-----Xamarin.Forms Core Project-----
| - Imports NuGet |
------------------------------------
^
|
-------Xamarin Android Project------
| - Imports Xamarin Forms Core Proj|
| - Produces APK |
------------------------------------
看起来不是命名问题——在绑定项目中尝试将native_lib.so
重命名为libnative_lib.so
没有效果。
我是否漏掉了一步,或者NuGet根本不理解Xamarin.Android项目需要将本地库复制到APK中?
NuGet项目的源代码:https://github.com/pingzing/scannitsharp 消费NuGet的Xamarin Forms项目的源代码:https://github.com/pingzing/scannit NuGet包:https://www.nuget.org/packages/ScannitSharp/1.0.5.1