mono / SkiaSharp

SkiaSharp is a cross-platform 2D graphics API for .NET platforms based on Google's Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render images.
MIT License
4.52k stars 540 forks source link

[BUG] iOS - Method not found: SkiaSharp.SKTextBlob SkiaSharp.SKTextBlob.CreatePositioned #2147

Open Martinn2 opened 2 years ago

Martinn2 commented 2 years ago

Description

Xamarin forms iOS app throws System.MissingMethodException when trying to call SKTextBlob.CreatePositioned. On android and windows it works fine

Code

SKTextBlob.CreatePositioned("aaaa",new SKFont(SKTypeface.CreateDefault()), new ReadOnlySpan(new SKPoint[]{ SKPoint.Empty }) );

Basic Information

Version info VS 2022 17.2.5 Xamarin.Forms 5.0.0.2196 Compiled on macOS Monterey version 12.4

To reproduce create new Xamarin.Forms app, install SkiaSharp 2.88.0 and use the code in "Code" section

cschwarz commented 2 years ago

I'm facing the same issue with 2.88.1

JohnBot2013 commented 1 year ago

Me too using 2.88.3. Is anyone looking into it?

charlesroddie commented 1 year ago

Appears to be causing https://github.com/wieslawsoltes/Svg.Skia/issues/125

MartinZikmund commented 1 year ago

To whomever hits this, we encountered this issue on Uno Platform and the root cause of this is the fact that SkiaSharp in .NET Standard 2.0 references System.Memory in a different version and that version mismatch causes issues with ReadOnlySpan. The workaround is to add the following targets to the iOS .csproj:

<Target Name="VSMac_RemoveSystemMemory" BeforeTargets="ResolveAssemblyReferences">
  <ItemGroup>
    <_ReferenceToRemove Include="@(Reference)" Condition="'%(Reference.Identity)'=='System.Memory'" />
    <Reference Remove="@(_ReferenceToRemove)" />
    <Reference Include="System.Memory" />
  </ItemGroup>
</Target>

<Target Name="VS_RemoveSystemMemory" BeforeTargets="FindReferenceAssembliesForReferences">
  <ItemGroup>
    <_ReferencePathToRemove Include="@(ReferencePath)" Condition="'%(ReferencePath.NuGetPackageId)'=='System.Memory'" />
    <ReferencePath Remove="@(_ReferencePathToRemove)" />
  </ItemGroup>
</Target>
fabiansanchez18 commented 1 year ago

To whomever hits this, we encountered this issue on Uno Platform and the root cause of this is the fact that SkiaSharp in .NET Standard 2.0 references System.Memory in a different version and that version mismatch causes issues with ReadOnlySpan. The workaround is to add the following targets to the iOS .csproj:

<Target Name="VSMac_RemoveSystemMemory" BeforeTargets="ResolveAssemblyReferences">
  <ItemGroup>
    <_ReferenceToRemove Include="@(Reference)" Condition="'%(Reference.Identity)'=='System.Memory'" />
    <Reference Remove="@(_ReferenceToRemove)" />
    <Reference Include="System.Memory" />
  </ItemGroup>
</Target>

<Target Name="VS_RemoveSystemMemory" BeforeTargets="FindReferenceAssembliesForReferences">
  <ItemGroup>
    <_ReferencePathToRemove Include="@(ReferencePath)" Condition="'%(ReferencePath.NuGetPackageId)'=='System.Memory'" />
    <ReferencePath Remove="@(_ReferencePathToRemove)" />
  </ItemGroup>
</Target>

This really worked for me. Thank you very much. Xamarin.Forms = 5.0.0.2545 SkiaSharp.Views.Forms = 2.88.3 Svg.Skia = 0.5.18

JohnBot2013 commented 1 year ago

To whomever hits this, we encountered this issue on Uno Platform and the root cause of this is the fact that SkiaSharp in .NET Standard 2.0 references System.Memory in a different version and that version mismatch causes issues with ReadOnlySpan. The workaround is to add the following targets to the iOS .csproj:

<Target Name="VSMac_RemoveSystemMemory" BeforeTargets="ResolveAssemblyReferences">
  <ItemGroup>
    <_ReferenceToRemove Include="@(Reference)" Condition="'%(Reference.Identity)'=='System.Memory'" />
    <Reference Remove="@(_ReferenceToRemove)" />
    <Reference Include="System.Memory" />
  </ItemGroup>
</Target>

<Target Name="VS_RemoveSystemMemory" BeforeTargets="FindReferenceAssembliesForReferences">
  <ItemGroup>
    <_ReferencePathToRemove Include="@(ReferencePath)" Condition="'%(ReferencePath.NuGetPackageId)'=='System.Memory'" />
    <ReferencePath Remove="@(_ReferencePathToRemove)" />
  </ItemGroup>
</Target>

Thank you Martin. This worked for me too.

jl-mobitech commented 1 year ago

To whomever hits this, we encountered this issue on Uno Platform and the root cause of this is the fact that SkiaSharp in .NET Standard 2.0 references System.Memory in a different version and that version mismatch causes issues with ReadOnlySpan. The workaround is to add the following targets to the iOS .csproj:

<Target Name="VSMac_RemoveSystemMemory" BeforeTargets="ResolveAssemblyReferences">
  <ItemGroup>
    <_ReferenceToRemove Include="@(Reference)" Condition="'%(Reference.Identity)'=='System.Memory'" />
    <Reference Remove="@(_ReferenceToRemove)" />
    <Reference Include="System.Memory" />
  </ItemGroup>
</Target>

<Target Name="VS_RemoveSystemMemory" BeforeTargets="FindReferenceAssembliesForReferences">
  <ItemGroup>
    <_ReferencePathToRemove Include="@(ReferencePath)" Condition="'%(ReferencePath.NuGetPackageId)'=='System.Memory'" />
    <ReferencePath Remove="@(_ReferencePathToRemove)" />
  </ItemGroup>
</Target>

Works like a charm, thanks!

SashelI commented 9 months ago

Hi I have this error on UWP build from Unity, could it be linked ? How to adapt the IOS fix if it is ?

1>EXEC : error : Unity.IL2CPP.Building.BuilderFailedException: Svg.Skia.cpp
1>C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\Source\il2cppOutput\Svg.Skia.cpp(11638): error C2664: 'SKTextBlob_t5A224EAAE51CDAE3AC22F0117DB16B3D16BDE3DB *SKTextBlob_CreatePositioned_mD6854C5848231F736785A7E922DBC41145BB8C69(String_t *,SKFont_tC395A6D2120F06176FC8D28A21BD2B70511A9D0E *,ReadOnlySpan_1_t6EC0A6555D2AA6759727FFA6D6B26499FE81A6BF,const RuntimeMethod *)'�: impossible de convertir l'argument 3 de 'ReadOnlySpan_1_t72A99341F6FD442048F249ECC03200102D1EA4AF' en 'ReadOnlySpan_1_t6EC0A6555D2AA6759727FFA6D6B26499FE81A6BF'
1>C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\Source\il2cppOutput\Svg.Skia.cpp(11638): note: Aucun op�rateur de conversion d�finie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'op�rateur ne peut pas �tre appel�
1>C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\Source\il2cppOutput\Svg.Skia.cpp(4493): note: voir la d�claration de 'SKTextBlob_CreatePositioned_mD6854C5848231F736785A7E922DBC41145BB8C69'
1>C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\Source\il2cppOutput\Svg.Skia.cpp(11638): note: lors de la tentative de mise en correspondance de la liste des arguments '(String_t *, SKFont_tC395A6D2120F06176FC8D28A21BD2B70511A9D0E *, ReadOnlySpan_1_t72A99341F6FD442048F249ECC03200102D1EA4AF, int)'
1>
1>Invocation was: Executable: "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\bin\HostX64\ARM64\cl.exe"
1>Arguments: "C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\Source\il2cppOutput\Svg.Skia.cpp" /nologo /c /bigobj /W3 /Z7 /EHs /GR- /Gy /utf-8 /wd4102 /wd4800 /wd4056 /wd4190 /wd4723 /wd4467 /wd4503 /wd4996 /wd4200 /wd4834 /wd4722 /Ox /Oi /Oy- /GS- /Gw /GF /Zo /Yupch-cpp.hpp /Fp"C:\DevPerso\_Builds\HarborHL\build\obj\il2cppOutputProject\ARM64\Release\57DA57A1CF804A4DFC88B3636B712447.pch" /MD -d2ssa-cfg-jt- /DWINDOWS_UWP /DUNITY_UWP /DUNITY_WSA_10_0 /DUNITY_WSA /DUNITY_WINRT /DPLATFORM_WINRT /DNET_4_0 /DUNITY_AOT /DIL2CPP_MONO_DEBUGGER_DISABLED /DGC_NOT_DLL /DRUNTIME_IL2CPP /DBASELIB_INLINE_NAMESPACE=il2cpp_baselib /DIL2CPP_DEFAULT_DATA_DIR_PATH=Data/il2cpp_data /DBASELIB_USE_DYNAMICLIBRARY=1 /D_WIN32 /DWIN32 /DWIN32_THREADS /D_WINDOWS /DWINDOWS /D_UNICODE /DUNICODE /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /D_WINSOCK_DEPRECATED_NO_WARNINGS /DNOMINMAX /D_NDEBUG /DNDEBUG /DWINDOWS_SDK_BUILD_VERSION=22621 /D__WRL_NO_DEFAULT_LIB__ /DWINAPI_FAMILY=WINAPI_FAMILY_APP /I"C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\IL2CPP\libil2cpp" /I"C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\IL2CPP\libil2cpp" /I"C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\IL2CPP\external\bdwgc\include" /I"C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\IL2CPP\external\xxHash" /I"C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\IL2CPP\external\baselib\Include" /I"C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\IL2CPP\external\baselib\Platforms\UniversalWindows\Include" /I"C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\IL2CPP\libil2cpp\pch" /I"C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\IL2CPP\libil2cpp\os\ClassLibraryPAL\brotli\include" /I"C:\DevPerso\_Builds\HarborHL\Il2CppOutputProject\Source" /I"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\include" /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\shared" /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um" /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\winrt" /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\ucrt" /Fo"C:\DevPerso\_Builds\HarborHL\build\obj\il2cppOutputProject\ARM64\Release\7CE9CD23BEFFDE1F4F02B0DE971C7609.obj" /Fd"C:\DevPerso\_Builds\HarborHL\build\obj\il2cppOutputProject\ARM64\Release\7CE9CD23BEFFDE1F4F02B0DE971C7609.pdb"
1>EnvArg key: PATH value: C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64;C:\Program Files (x86)\Windows Kits\10\bin\x64;C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x86;C:\Program Files (x86)\Windows Kits\10\bin\x86;C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\bin\HostX64\x64
1>
1>   at Unity.IL2CPP.Building.CppProgramBuilder.BuildAllCppFiles(IEnumerable`1 sourceFilesToCompile, IBuildStatisticsCollector statisticsCollector)