【问题标题】:Can't compile Xamarin android project with StructureMap in release mode无法在发布模式下使用 StructureMap 编译 Xamarin android 项目
【发布时间】:2018-01-06 05:44:45
【问题描述】:

在 Visual Studio 中创建一个空白的 android 项目 Blank App (Android) 然后添加以下 nuget 包
NETStandard.Library 1.6.1
结构图 4.5.2

现在尝试在发布模式下编译项目。 我收到以下错误:

Using "LinkAssemblies" task from assembly "C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Build.Tasks.dll".
Task "LinkAssemblies"
  LinkAssemblies Task
    UseSharedRuntime: False
    MainAssembly: obj\Release\linksrc\App2.dll
    OutputDirectory: obj\Release\android\assets\
    OptionalDestinationDirectory:
    I18nAssemblies:
    LinkMode: SdkOnly
    LinkSkip:
    LinkDescriptions:
    ResolvedAssemblies:
      obj\Release\linksrc\App2.dll
      obj\Release\linksrc\Java.Interop.dll
      obj\Release\linksrc\Mono.Android.dll
      obj\Release\linksrc\System.Core.dll
      obj\Release\linksrc\System.dll
      obj\Release\linksrc\System.IO.Compression.dll
      obj\Release\linksrc\System.Net.Http.dll
      obj\Release\linksrc\System.Xml.dll
      obj\Release\linksrc\mscorlib.dll
      obj\Release\linksrc\StructureMap.dll
      obj\Release\linksrc\System.Runtime.Loader.dll
      obj\Release\linksrc\System.Runtime.dll
      obj\Release\linksrc\System.ComponentModel.Composition.dll
      obj\Release\linksrc\System.Threading.dll
      obj\Release\linksrc\System.Collections.dll
      obj\Release\linksrc\System.Collections.Concurrent.dll
      obj\Release\linksrc\System.Reflection.dll
      obj\Release\linksrc\System.Diagnostics.Debug.dll
      obj\Release\linksrc\System.Linq.dll
      obj\Release\linksrc\System.Runtime.InteropServices.dll
      obj\Release\linksrc\System.Runtime.Extensions.dll
      obj\Release\linksrc\System.Reflection.Extensions.dll
      obj\Release\linksrc\System.Runtime.Serialization.dll
      obj\Release\linksrc\System.ServiceModel.Internals.dll
      obj\Release\linksrc\Mono.Security.dll
      obj\Release\linksrc\System.Resources.ResourceManager.dll
      obj\Release\linksrc\System.IO.dll
      obj\Release\linksrc\System.Threading.Tasks.dll
      obj\Release\linksrc\System.Linq.Expressions.dll
      obj\Release\linksrc\System.Reflection.Emit.Lightweight.dll
      obj\Release\linksrc\System.Reflection.Emit.ILGeneration.dll
      obj\Release\linksrc\System.Reflection.TypeExtensions.dll
      obj\Release\linksrc\System.Reflection.Primitives.dll
      obj\Release\linksrc\System.Globalization.dll
      obj\Release\linksrc\System.AppContext.dll
      obj\Release\linksrc\System.IO.FileSystem.dll
      obj\Release\linksrc\System.Console.dll
    EnableProguard: False
    ProguardConfiguration:
    DumpDependencies: False
    LinkOnlyNewerThan:
    HttpClientHandlerType:
    TlsProvider:
C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018: The "LinkAssemblies" task failed unexpectedly.
C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018: Mono.Linker.MarkException: Error processing method: 'System.Boolean StructureMap.Graph.AssemblyFinder/<FindAssemblies>
  d__1::MoveNext()' in assembly: 'StructureMap.dll' ---> Mono.Cecil.ResolutionException: Failed to resolve System.Runtime.Loader.AssemblyLoadContext System.Runtime.Loader.AssemblyLoadContext::get_Default()
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Mono.Linker.Steps.MarkStep.HandleUnresolvedMethod(MethodReference reference)
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Mono.Linker.Steps.MarkStep.MarkMethod(MethodReference reference)
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Mono.Linker.Steps.MarkStep.MarkInstruction(Instruction instruction)
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Mono.Linker.Steps.MarkStep.MarkMethodBody(MethodBody body)
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Mono.Linker.Steps.MarkStep.ProcessMethod(MethodDefinition method)
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Mono.Linker.Steps.MarkStep.ProcessQueue()
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    --- End of inner exception stack trace ---
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Mono.Linker.Steps.MarkStep.ProcessQueue()
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Mono.Linker.Steps.MarkStep.Process()
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Mono.Linker.Steps.MarkStep.Process(LinkContext context)
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Mono.Linker.Pipeline.Process(LinkContext context)
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at MonoDroid.Tuner.Linker.Process(LinkerOptions options, LinkContext& context)
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Xamarin.Android.Tasks.LinkAssemblies.Execute(DirectoryAssemblyResolver res)
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Xamarin.Android.Tasks.LinkAssemblies.Execute()
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
  C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1577,5): error MSB4018:    at Microsoft.Build.BackEnd.TaskBuilder.<ExecuteInstantiatedTask>d__26.MoveNext()
Done executing task "LinkAssemblies" -- FAILED.
Done building target "_LinkAssembliesShrink" in project "App2.csproj" -- FAILED.

Build FAILED.

在调试模式下,它按预期编译,但我猜 LinkAssemblies 任务不会运行。

我正在使用 Xamarin 4.6.0.297 和 Visual Studio 2015。

这是StructureMapXamarin 的问题吗?

【问题讨论】:

  • 您是否尝试将链接选项更改为根本不链接?
  • @saketkumar 当我将 Linking 设置为 None 时,它​​会编译,Linking 有什么作用?
  • 链接器有时可能非常激进,它应该从各种程序集中删除未使用的代码。但它对代码的编译时使用做出判断。因此,如果通过反射使用某些代码,则无法判断这是运行时,并且可能会删除导致您面临的问题的那部分代码。
  • 如果这有助于让我知道,我会添加一些附加信息作为答案,以便在遇到链接器相关问题时可以帮助更多人。
  • 将链接器更改为None 不是一个完整的解决方案,而是一种解决方法,它会增加您的应用程序大小。您应该查看链接跳过此程序集:developer.xamarin.com/guides/android/advanced_topics/linking/… 或创建自定义链接器配置:developer.xamarin.com/guides/cross-platform/advanced/…

标签: xamarin xamarin.android structuremap


【解决方案1】:

更新:

这似乎是链接器和不同版本的 NetStandard 库的问题。 StructureMap 在 nuget 中设置为支持 .Net45、NetStandard 1.3 和 NetStandard 1.5,当添加 NetStandard Lib 1.6 时,除非您将包更新到 NetStandard Lib 2.0(及其匹配库),您将收到Mono.Cecil 错误:

Mono.Cecil.ResolutionException: Failed to resolve System.Runtime.Loader.AssemblyLoadContext System.Runtime.Loader.AssemblyLoadContext::get_Default()

注意:我不确定这是 Mono.Cecil 的问题,StructureMap 的打包方式还是 Xamarin 处理 nuget 引用的方式...

LinkDescription:

如下所示的链接器配置将帮助您解决问题:

<linker>
        <assembly fullname="StructureMap">
                <namespace fullname="StructureMap.*" />
        </assembly>
</linker>

只需将包含上述内容的 XML 文件添加到您的项目中,并为其分配 LinkDescription 的构建操作。

注意:使用AndroidLinkSkip 跳过程序集将不起作用...

【讨论】:

  • 遗憾的是这没有帮助,我也尝试以相同的方式添加System.Runtime.Loader,但在链接过程中出现同样的错误。
  • @Peter 我刚刚尝试了一个新项目,向其中添加了StructureMap,创建了一个结构映射Container,所以有些东西正在引用它,添加了上面的 LinkDescription 文件,它可以很好地编译和存档链接器设置为 AllSDK 的发布模式
  • 没有xml文件的时候会出现同样的错误吗?
  • @Peter 是的,和你的 Mono.Cecil 一样(我知道那个错误 ;-)
  • @Peter 我想知道它是否是 NETStandard lib 的 xamarin 版本问题,创建一个新的 droid 项目添加 StructureMap 之后更新所有包,以便 netstandard lib 为 2.0,然后切换到发布模式(链接器 sdk或全部)并编译(没有 LinkDescription 文件)
【解决方案2】:

对我来说,添加 LinkDescription 文件、使用 AndroidLinkToSkip 并更新到 .NETStandard 2.0 都不起作用。相反,我按照https://github.com/structuremap/structuremap/pull/597 的建议将 StructureMap 降级为 4.4.0。这似乎解决了问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多