在ILMerge SkiaSharp到我的Xamarin.iOS dll后引发DllNotFoundException

在ILMerge SkiaSharp到我的Xamarin.iOS dll后引发DllNotFoundException,xamarin.ios,ilmerge,skiasharp,Xamarin.ios,Ilmerge,Skiasharp,我尝试创建一个Xamarin.iOS类库,它在内部使用SkiaSharep。我想将最终的类库作为一个没有外部依赖关系的dll分发。为此,我使用ILMerge(或ILRepack)。最终的dll已成功创建,但当我尝试从类库调用某个方法时,我得到了DllNotFoundException。以下是堆栈跟踪: {System.DllNotFoundException: @rpath/libSkiaSharp.framework/libSkiaSharp-at(包装器 管理为本机)SkiaSharp.Sk

我尝试创建一个Xamarin.iOS类库,它在内部使用SkiaSharep。我想将最终的类库作为一个没有外部依赖关系的dll分发。为此,我使用ILMerge(或ILRepack)。最终的dll已成功创建,但当我尝试从类库调用某个方法时,我得到了DllNotFoundException。以下是堆栈跟踪:

{System.DllNotFoundException: @rpath/libSkiaSharp.framework/libSkiaSharp-at(包装器 管理为本机)SkiaSharp.SkiaApi:sk_filestream_new(字符串)位于 SkiaSharp.SKFileStream..ctor(System.String路径)[0x00000]输入 :0位于SkiaSharp.SKBitmap.Decode 中的(System.String文件名)[0x00011] :0 at 中的TestMerge.TestClass.TestMethod(System.String imageFile)[0x00001] :0在Tests.Xamarin.Tests.Test001处 ()[0x00002]英寸 /Users/mac1/Projects/awxamarin/Xamarin.Tests/Tests.Xamarin/Tests.cs:19 }

复制步骤:

  • 创建一个简单的Xamarin.iOS类库
  • 添加对SkiaSharep的引用
  • 使用使用SkiaSharp的方法创建一些简单的公共类。比如说

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

    ILMerge.exe/log:C:\Temp\ILMerge.log/internalize/ndebug/targetplatform:v4,“C:\ProgramFiles(x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\ReferenceAssemblies\Microsoft\Framework\Xamarin.iOS\v1.0”/out:C:\Temp\TestMerge.dll C:\Temp\TestMerge\bin\Debug\TestMerge\TestMerge.dll C:\Temp\TestMerge\TestMerge\bin\Debug\SkiaSharp.dll

  • 创建Xamarin.iOS应用程序(我使用UnitTest应用程序进行测试)向创建的dll添加引用,调用方法TestMethod。结果System.DllNotFoundException:@rpath/libSkiaSharp.framework/libSkiaSharp发生
  • 我尝试反编译我的dll,libSkiaSharp.framework就在那里,它作为一种资源嵌入,就像在SkiaSharp.dll中一样。 任何帮助都是感激的,我被困在这。
    顺便说一句,完全相同的方法对Xamarin.Android很有效。

    我终于成功了。解决方案一如既往地简单:)。要使其工作,需要将以下属性添加到主类库项目的AssemblyInfo.cs中:

    [程序集:ObjCRuntime.LinkWith(“libSkiaSharp.framework”,SmartLink=true)]
    

    希望这对其他人有用

    我终于让它工作起来了。解决方案一如既往地简单:)。要使其工作,需要将以下属性添加到主类库项目的AssemblyInfo.cs中:

    [程序集:ObjCRuntime.LinkWith(“libSkiaSharp.framework”,SmartLink=true)]
    

    希望这对其他人有用

    仅链接回Xamarin论坛问题:仅链接回Xamarin论坛问题: