我尝试创建一个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 }
重现的步骤:
使用SkiaSharp创建一些简单的公共类。例如
namespace TestMerge
{
public class TestClass
{
public static void TestMethod(string imageFile)
{
SkiaSharp.SKBitmap bmp = SkiaSharp.SKBitmap.Decode(imageFile);
}
}
}
使用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
我试图反编译我的dll并且libSkiaSharp.framework就在那里,它作为资源嵌入,就像在SkiaSharp.dll中一样。 任何帮助表示赞赏,我坚持这一点。 顺便说一句,完全相同的方法适用于Xamarin.Android。
答案 0 :(得分:0)
我终于明白了。解决方案很简单:)。要使其工作,需要将以下属性添加到主类库项目的AssemblyInfo.cs中:
[assembly: ObjCRuntime.LinkWith("libSkiaSharp.framework", SmartLink = true)]
希望这对其他人有用