无法在发布模式下使用 StructureMap 编译 Xamarin android 项目
Can't compile Xamarin android project with StructureMap in release mode
在 Visual Studio 中创建一个空白 android 项目 Blank App (Android)
然后添加以下 nuget 包
NETStandard.Library1.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。
这是 StructureMap
或 Xamarin
中的问题吗?
更新:
这似乎是链接器和不同版本的 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
跳过程序集将不起作用...
对我来说,添加 LinkDescription
文件、使用 AndroidLinkToSkip
和更新到 .NETStandard 2.0 都没有用。相反,我按照 https://github.com/structuremap/structuremap/pull/597 的建议将 StructureMap 降级为 4.4.0。这似乎已经解决了问题
在 Visual Studio 中创建一个空白 android 项目 Blank App (Android)
然后添加以下 nuget 包
NETStandard.Library1.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。
这是 StructureMap
或 Xamarin
中的问题吗?
更新:
这似乎是链接器和不同版本的 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
跳过程序集将不起作用...
对我来说,添加 LinkDescription
文件、使用 AndroidLinkToSkip
和更新到 .NETStandard 2.0 都没有用。相反,我按照 https://github.com/structuremap/structuremap/pull/597 的建议将 StructureMap 降级为 4.4.0。这似乎已经解决了问题