2017-07-24 3 views
1

geworfen Ich versuche, eine Xamarin.iOS-Klassenbibliothek zu erstellen, die SkiaSharp intern verwendet. Ich möchte die letzte Klassenbibliothek als eine einzige DLL ohne externe Abhängigkeiten verteilen. Zu diesem Zweck verwende ich ILMerge (oder ILRepack). Endgültige DLL wird erfolgreich erstellt, aber wenn ich versuche, eine Methode aus meiner Klassenbibliothek aufzurufen, bekomme ich DllNotFoundException. Hier ist der Stack-Trace:DllNotFoundException wird nach ILMerge SkiaSharp in meine Xamarin.iOS DLL

{System.DllNotFoundException: @ rpath/libSkiaSharp.framework/libSkiaSharp bei (Wrapper Managed-to-native) SkiaSharp.SkiaApi: sk_filestream_new (string) bei SkiaSharp.SKFileStream. .ctor (System.String Pfad) [0x00000] in < 9d222c42d8aa4f729033b25ddebc012a>: 0 bei SkiaSharp.SKBitmap.Decode (System.String Dateiname) [0x00011] in < 9d222c42d8aa4f729033b25ddebc012a>: 0 bei TestMerge.TestClass.TestMethod (System .String imageFile) [0x00001] in < 9d222c42d8aa4f729033b25ddebc012a>: 0 bei Tests.Xamarin.Tests.Test001 () [0x00002] in /Users/mac1/Projects/awxamarin/Xamarin.Tests/Tests.Xamarin/Tests.cs:19 }

Schritte zum Reproduzieren:

  1. Erstellen Sie eine einfache Xamarin.iOS-Klassenbibliothek.
  2. Verweis auf SkiaSharp hinzufügen
  3. Erstellen Sie eine einfache öffentliche Klasse mit einer Methode, die SkiaSharp verwendet. Zum Beispiel

    namespace TestMerge 
    { 
        public class TestClass 
        { 
         public static void TestMethod(string imageFile) 
         { 
          SkiaSharp.SKBitmap bmp = SkiaSharp.SKBitmap.Decode(imageFile); 
         } 
        } 
    } 
    
  4. Erstellen Sie das Projekt und verschmelzen dlls mit ILMerge (oder ILRepack, wenn Sie es mögen). Hier ist der Befehl dlls fusionieren:

    ILMerge.exe /log:C:\Temp\ILMerge.log/internalize/NDEBUG/targetplatform: v4 "C: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ Common7 \ IDE \ ReferenceAssemblies \ Microsoft \ Framework \ Xamarin.iOS \ v1.0 "/out:C:\Temp\TestMerge.dll C: \ Temp \ TestMerge \ TestMerge \ bin \ Debug \ TestMerge. dll C: \ Temp \ TestMerge \ TestMerge \ bin \ Debug \ SkiaSharp.dll

  5. erstellen Xamarin.iOS Anwendung (I verwendet Unittest Anwendung zum Testen) in Bezug auf erstellt dll, Anrufverfahren Testmethod. Als das Ergebnis tritt die System.DllNotFoundException auf: @ rpath/libSkiaSharp.framework/libSkiaSharp.

Ich habe versucht, meine DLL und libSkiaSharp.framework zu dekompilieren ist da, es ist als Ressource eingebettet, genau wie in SkiaSharp.dll. Jede Hilfe wird geschätzt, ich bleibe dabei. Übrigens funktioniert genau der gleiche Ansatz für Xamarin.Android.

+0

nur nützlich sein, Link zurück zu den Xamarin Foren Frage: https://forums.xamarin.com/discussion/100071/ilmerge-skiasharp#latest – Matthew

Antwort

0

Ich endlich habe es funktioniert. Die Lösung war einfach wie immer :). Um es es funktioniert erforderlich, um das folgende Attribut in die AssemblyInfo.cs der Hauptklassenbibliothek Projekt hinzuzufügen:

[assembly: ObjCRuntime.LinkWith("libSkiaSharp.framework", SmartLink = true)] 

hoffen, dass dies für andere

Verwandte Themen