我尝试创建一个 Xamarin.iOS 类库,它在内部使用 SkiaSharp。我想将最终的类库作为单个 dll 分发,而不需要外部依赖。为此,我使用 ILMerge(或 ILRepack)。最终 dll 已成功创建,但是当我尝试从类库中调用某些方法时,我得到了 DllNotFoundException。这是堆栈跟踪:
{System.DllNotFoundException:@rpath/libSkiaSharp.framework/libSkiaSharp at (wrapper managed-to-native) SkiaSharp.SkiaApi:sk_filestream_new (string) at SkiaSharp.SKFileStream..ctor (System.String path) [0x00000] in <9d222c42d8aa4f729033b25ddebc012a> :0 at SkiaSharp.SKBitmap.Decode (System.String filename) [0x00011] in <9d222c42d8aa4f729033b25ddebc012a>:0 at TestMerge.TestClass.TestMethod (System.String imageFile) [0x00001] in <9d222c42d8aa4f729033b25ddebc012a>:0 at Test.Test .Test001 () [0x00002] 在 /Users/mac1/Projects/awxamarin/Xamarin.Tests/Tests.Xamarin/Tests.cs:19 }
重现步骤:
- 创建一个简单的 Xamarin.iOS 类库。
- 添加对 SkiaSharp 的引用
使用使用 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:\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
- 创建 Xamarin.iOS 应用程序(我使用 UnitTest 应用程序进行测试)添加对创建的 dll 的引用,调用方法 TestMethod。结果 System.DllNotFoundException: @rpath/libSkiaSharp.framework/libSkiaSharp 发生。
我试图反编译我的 dll 并且 libSkiaSharp.framework 在那里,它作为资源嵌入,就像在 SkiaSharp.dll 中一样。任何帮助表示赞赏,我坚持这一点。顺便说一句,完全相同的方法适用于 Xamarin.Android。