Sol*_*444 5 c# android ios xamarin xamarin.forms
感觉世界上没有人做过这件事。我找不到关于如何创建它的任何教程或帮助。我想要做的是创建我自己的插件,比如说向 Xamarin 表单添加通知,这将适用于 Android、iOS 和 UWP。我看到的每一次提及都提到创建一个多平台库,但这仅适用于 VS for Mac,不包括 UWP。VS2017 不包含多平台库模板。我希望它像所有其他 xamarin 插件一样工作,您可以从 nuget 将其下载到所有项目中,并且您可以访问平台实现和共享代码。
我在 stackoverflow 上看到了其他问题,但他们没有回答,或者链接已经失效并且在 VS2017 上不起作用。
如何创建可在多个项目之间共享的 xamarin 表单库?我怎样才能把它变成一个 nuget 包,所以它是一个无脑安装并且它可以正常工作?越详细越好,因为它会帮助我看到谷歌搜索这个问题但没有找到答案的每个人。
请记住,这不是像微软教程展示的那样适用于 Visual Studio Mac,而是适用于具有最新更新的 VS 2017 社区版。
编辑1:
只是为了添加下面的一些评论,我还尝试了 James 创建的这个插件,它甚至无法像在他的 youtube 视频中那样工作:https : //www.youtube.com/watch?v= MSwH8NrtVCk & feature = YouTube
生成的项目没有任何文件夹。
这正是 MvvmCross、ReactiveUI 和其他框架所做的。所以声称世界上没有人这样做是一种疯狂的想象。
一种方法是创建一个多目标库,请注意 Visual Studio for Mac 还不喜欢这些项目,并且在那里创建和开发这样的库时会遇到问题。但是,如果您仅在 Windows Visual Studio 2017 和更新版本上开发,则可以很好地支持此类项目。
您可以从在 VS 中创建一个 .NET Standard 库开始,这将为您提供一个包含 Class1 的单个 .cs 文件的项目,然后将其删除。
如果您编辑 .csproj 文件,您将PropertyGroup在文件顶部看到一个包含名为TargetFramework. 将其更改为TargetFrameworks并列出您想要定位的所有所需框架:
<PropertyGroup
<TargetFrameworks>netstandard2.0;Xamarin.iOS10;MonoAndroid81;uap10.0.16299</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)
如果您希望在多目标库中获得轻松支持,我建议您为您的项目 SDK 切换到 MSBuildSDKExtras,因为它将处理针对 Xamarin 平台带来的许多怪癖。它将为您的项目添加必要的属性以完成所有这些工作。
因此 .csproj 文件的第一行必须如下所示:
<Project Sdk="MSBuild.Sdk.Extras/1.6.68">
Run Code Online (Sandbox Code Playgroud)
现在,你需要在哪些文件夹平台特定的代码是在指定我通常做的是什么,以创建一个platforms与文件夹android,ios和uap文件夹,并考虑代码平台独立的休息和居住在common。
<ItemGroup>
<Compile Remove="platforms\**\*.cs" />
<None Include="platforms\**\*.cs" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard')) ">
<Compile Include="platforms\common\**\*.cs" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('Xamarin.iOS')) ">
<Compile Include="platforms\ios\**\*.cs" />
<Compile Include="platforms\common\**\*.cs" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('MonoAndroid')) ">
<Compile Include="platforms\android\**\*.cs" />
<Compile Include="platforms\common\**\*.cs" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('uap')) ">
<Compile Include="platforms\uap\**\*.cs" />
<Compile Include="platforms\common\**\*.cs" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
为了从这个多目标库很好地创建 NuGet 包,我通常Directory.build.props在解决方案的根目录中添加一个文件,在其中指定包的属性:
<Project>
<PropertyGroup>
<Company>Cheesebaron</Company>
<Copyright>Copyright © Cheesebaron</Copyright>
<RepositoryUrl>https://github.com/cheeesebaron/cool-stuff</RepositoryUrl>
<Authors>Cheesebaron</Authors>
<Owners>Cheesebaron</Owners>
<PackageReleaseNotes />
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<RepositoryType>git</RepositoryType>
<Product>$(AssemblyName) ($(TargetFramework))</Product>
<NeutralLanguage>en</NeutralLanguage>
<LangVersion>latest</LangVersion>
<NoWarn>$(NoWarn);1591;1701;1702;1705;VSX1000;NU1603</NoWarn>
<GenerateDocumentationFile Condition=" '$(Configuration)' == 'Release' ">true</GenerateDocumentationFile>
<GeneratePackageOnBuild Condition=" '$(Configuration)' == 'Release' and '$(IsTestProject)' != 'true'">true</GeneratePackageOnBuild>
<Platform>AnyCPU</Platform>
<DebugType>portable</DebugType>
<AllowedOutputExtensionsInPackageBuildOutputFolder>$(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb</AllowedOutputExtensionsInPackageBuildOutputFolder>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<IsTestProject>$(MSBuildProjectName.Contains('UnitTests'))</IsTestProject>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
我还添加了一个Directory.build.targets定义不同平台常量的文件:
<Project>
<PropertyGroup Condition="$(TargetFramework.StartsWith('netstandard'))">
<DefineConstants>$(DefineConstants);NETSTANDARD;PORTABLE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$(TargetFramework.StartsWith('Xamarin.iOS'))">
<DefineConstants>$(DefineConstants);MONO;UIKIT;COCOA;IOS</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="$(TargetFramework.StartsWith('MonoAndroid'))">
<DefineConstants>$(DefineConstants);MONO;ANDROID</DefineConstants>
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<AndroidResgenClass>Resource</AndroidResgenClass>
<AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
如果您的目标是 Android,您可能还需要添加:
<None Include="Resources\*.cs" />
<Compile Remove="Resources\*.cs" />
Run Code Online (Sandbox Code Playgroud)
ItemGroup在 .csproj 文件的第一个中添加如下内容:
<AndroidResource Include="Resources\**\*.xml" SubType="Designer" Generator="MSBuild:UpdateAndroidResources" />
<AndroidResource Include="Resources\**\*.axml" SubType="Designer" Generator="MSBuild:UpdateAndroidResources" />
Run Code Online (Sandbox Code Playgroud)
到AndroidItemGroup正确更新Android 资源。
在 Visual Studio 中添加文件可能有点棘手,它通常会将它们添加到前几个文件的错误位置,直到您在所有特定于平台的文件夹中都有一些内容。但是,只要文件正确放置在我们定义的结构中,您就不需要 .csproj 文件中的任何其他内容。
您可以在此处查看多目标库的示例:
https://github.com/MvvmCross/MvvmCross/blob/develop/MvvmCross/MvvmCross.csproj https://github.com/MvvmCross/MvvmCross/blob/develop/Directory.build.props https://github.com/ MvvmCross/MvvmCross/blob/develop/Directory.build.targets
同样对于 ReactiveUI:
https://github.com/reactiveui/ReactiveUI/blob/master/src/ReactiveUI/ReactiveUI.csproj
到目前为止,它上手并不容易,但很好用。替代方案是 .NET Standard 库和添加诱饵和切换模式的平台特定库。
| 归档时间: |
|
| 查看次数: |
2474 次 |
| 最近记录: |