ILMerge SkiaSharp进入我的Xamarin.iOS dll后抛出DllNotFoundException

时间:2017-07-24 08:12:55

标签: xamarin.ios ilmerge skiasharp

我尝试创建一个Xamarin.iOS类库,它在内部使用SkiaSharp。我想将最终的类库分发为单个dll,而不需要外部依赖。为此,我使用ILMerge(或ILRepack)。最终的dll已成功创建,但是当我尝试从类库中调用某个方法时,我得到了DllNotFoundException。这是堆栈跟踪:

  

{System.DllNotFoundException:   @ rpath / libSkiaSharp.framework / libSkiaSharp at(包装器   托管到原生)SkiaSharp.SkiaApi:sk_filestream_new(string)at   SkiaSharp.SKFileStream..ctor(System.String path)[0x00000] in   < 9d222c42d8aa4f729033b25ddebc012a>:0在SkiaSharp.SKBitmap.Decode   (System.String filename)[0x00011] in   < 9d222c42d8aa4f729033b25ddebc012a>:0 at   TestMerge.TestClass.TestMethod(System.String imageFile)[0x00001] in   < 9d222c42d8aa4f729033b25ddebc012a>:0在Tests.Xamarin.Tests.Test001   ()[0x00002] in   /Users/mac1/Projects/awxamarin/Xamarin.Tests/Tests.Xamarin/Tests.cs:19   }

重现的步骤:

  1. 创建一个简单的Xamarin.iOS类库。
  2. 添加对SkiaSharp的引用
  3. 使用SkiaSharp创建一些简单的公共类。例如

    namespace TestMerge
    {
        public class TestClass
        {
            public static void TestMethod(string imageFile)
            {
                SkiaSharp.SKBitmap bmp = SkiaSharp.SKBitmap.Decode(imageFile);
            }
        }
    }
    
  4. 使用ILMerge构建项目并合并dll(如果您更喜欢,则使用ILRepack)。这是用于合并dll的命令:

      

    ILMerge.exe /log:C:\Temp\ILMerge.log / internalize / ndebug / targetplatform:v4," C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Community \ Common7 \ IDE \ ReferenceAssemblies \微软\框架\ 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. 创建Xamarin.iOS应用程序(我使用UnitTest应用程序进行测试)添加对创建的dll的引用,调用方法TestMethod。结果是System.DllNotFoundException:@ rpath / libSkiaSharp.framework / libSkiaSharp发生。
  6. 我试图反编译我的dll并且libSkiaSharp.framework就在那里,它作为资源嵌入,就像在SkiaSharp.dll中一样。 任何帮助表示赞赏,我坚持这一点。 顺便说一句,完全相同的方法适用于Xamarin.Android。

1 个答案:

答案 0 :(得分:0)

我终于明白了。解决方案很简单:)。要使其工作,需要将以下属性添加到主类库项目的AssemblyInfo.cs中:

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

希望这对其他人有用