You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移项目至.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 01:42:30