迁移项目至.NET 6遇引用错误,求对应路径替代方案
问题与解答:Xamarin迁移到.NET 6+的CMake路径适配
问题背景
原Xamarin项目中使用以下CMake代码可正常编译生成DLL:
set(DEMO_MONO_BASE "/Library/Frameworks/Mono.framework/Versions/Current" CACHE STRING "Path to Mono for csharp bindings") set(DEMO_XAMARIN_BASE "/Library/Frameworks/Xamarin.iOS.framework/Versions/Current" CACHE STRING "Path to Xamarin for csharp bindings") set(CSC ${DEMO_MONO_BASE}/bin/csc) add_custom_target(sea ALL ${CSC} -o- -out:${CMAKE_BINARY_DIR}/abc/abc.dll -res:${CMAKE_BINARY_DIR}/xyz/abc.a -res:${CMAKE_BINARY_DIR}/libxyz_client.a ${CSHARP_FILES} -target:library -unsafe -reference:${DEMO_XAMARIN_BASE}/lib/mono/Xamarin.iOS/Xamarin.iOS.dll DEPENDS ${CSHARP_PROCESSED} xyz_swig)
尝试迁移到.NET 6+(实际配置为net7.0)时,添加了以下配置:
#reference flag set(SEA_DOTNET_BASE "/usr/local/share/dotnet/packs/Microsoft.iOS.Ref/16.4.7067/ref/net7.0/Microsoft.iOS.dll") set_target_properties(${this_target} PROPERTIES DOTNET_SDK "Microsoft.NET.Sdk" DOTNET_TARGET_FRAMEWORK "net7.0")
编译时遇到错误:
The type 'Attribute' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
请问在dotnet环境中,DEMO_MONO_BASE和DEMO_XAMARIN_BASE的等效路径是什么?
解答
1. 等效路径说明
- DEMO_MONO_BASE的等效路径:.NET 6+环境中不再需要单独指定Mono基础路径,因为.NET SDK已集成Roslyn编译器替代原
csc。若需直接定位编译器,路径通常为/usr/local/share/dotnet/sdk/<SDK版本号>/Roslyn/bincore/csc.dll,但更推荐通过dotnet命令间接调用工具,而非直接引用csc。 - DEMO_XAMARIN_BASE的等效路径:对应.NET iOS SDK的包目录,即你配置的
SEA_DOTNET_BASE所在的/usr/local/share/dotnet/packs/Microsoft.iOS.Ref/16.4.7067/——其中ref/net7.0存放引用程序集,runtimes/ios-x64/native等目录包含原生库。
2. 错误解决建议
你遇到的System.Runtime引用错误,源于.NET 6+采用共享框架设计,需通过SDK自动引用基础程序集,而非手动指定单个DLL。建议调整CMake配置:
- 放弃直接调用
csc,改用CMake的.NET原生支持特性创建类库目标,示例代码如下:
# 创建.NET类库目标 add_library(sea SHARED ${CSHARP_FILES}) set_target_properties(sea PROPERTIES DOTNET_SDK "Microsoft.NET.Sdk" DOTNET_TARGET_FRAMEWORK "net7.0-ios16.4" OUTPUT_NAME "abc" LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/abc" ) # 添加资源文件 set_property(TARGET sea PROPERTY DOTNET_RESOURCES "${CMAKE_BINARY_DIR}/xyz/abc.a" "${CMAKE_BINARY_DIR}/libxyz_client.a" ) # 添加Microsoft.iOS引用 find_package(Microsoft.iOS REQUIRED) target_link_libraries(sea PRIVATE Microsoft.iOS::Microsoft.iOS) # 绑定依赖项 add_dependencies(sea ${CSHARP_PROCESSED} xyz_swig)
- 确保已安装对应版本的.NET iOS workload(执行
dotnet workload install ios),CMake会自动处理System.Runtime等基础程序集的引用。
内容的提问来源于stack exchange,提问作者Android Developer World
相关产品推荐
相关产品推荐

