基于CMake 3.8的C#项目添加WSDL服务引用方法咨询
我之前帮团队把几个C#项目从VS解决方案迁移到CMake构建时,正好遇到过这个问题——CMake确实没有像VS那样一键添加服务引用的内置功能,但我们可以通过手动调用.NET官方的工具来实现等价效果,下面是具体的思路和步骤:
解决思路:手动调用.NET工具生成服务代理
VS里的“添加服务引用”本质上是后台调用了wsdl.exe(针对ASMX旧服务)或svcutil.exe(针对WCF服务)来生成C#代理类,CMake里我们只需要把这个过程用自定义命令封装起来即可。
步骤1:确定要使用的工具
先回忆你原来VS项目里的服务类型:
- 如果是传统ASMX Web服务,用
wsdl.exe - 如果是WCF服务,用
svcutil.exe
可以检查原来VS生成的代理类文件开头的注释,一般会标注是哪个工具生成的。
步骤2:在CMake中添加自定义命令生成代理类
用add_custom_command来触发工具调用,指定WSDL文件作为输入,生成的.cs文件作为输出。这里以WCF的svcutil.exe为例:
# 1. 配置路径和文件 set(WSDL_FILE "${CMAKE_CURRENT_SOURCE_DIR}/YourService.wsdl") # 把生成的代理类放在构建目录下,避免污染源码 set(OUTPUT_PROXY_DIR "${CMAKE_CURRENT_BINARY_DIR}/ServiceProxies") file(MAKE_DIRECTORY ${OUTPUT_PROXY_DIR}) # 确保输出目录存在 # 2. 查找svcutil.exe(可选,但更健壮) find_program(SVCUTIL_EXE NAMES svcutil.exe PATHS "$ENV{ProgramFiles}/Microsoft SDKs/Windows/v10.0A/bin/NETFX 4.8 Tools/" "${DOTNET_ROOT}" ) if(NOT SVCUTIL_EXE) message(FATAL_ERROR "无法找到svcutil.exe,请检查.NET SDK是否安装或路径是否正确") endif() # 3. 添加自定义生成命令 add_custom_command( OUTPUT "${OUTPUT_PROXY_DIR}/YourServiceClient.cs" COMMAND ${SVCUTIL_EXE} ${WSDL_FILE} /out:"${OUTPUT_PROXY_DIR}/YourServiceClient.cs" /namespace:YourProject.Services # 指定生成类的命名空间,和原来VS保持一致 /config:"${OUTPUT_PROXY_DIR}/App.config" # 可选:生成配置文件 MAIN_DEPENDENCY ${WSDL_FILE} # 当WSDL文件更新时,自动重新生成 COMMENT "正在从${WSDL_FILE}生成WCF服务代理..." )
如果是ASMX服务,把svcutil.exe换成wsdl.exe,调整参数即可(比如/namespace、/out这些参数wsdl.exe也支持)。
步骤3:将生成的代理类添加到项目中
把生成的.cs文件加入你的CMake目标(可执行文件或库):
add_executable(YourCSharpApp Program.cs # ... 其他源码文件 "${OUTPUT_PROXY_DIR}/YourServiceClient.cs" )
步骤4:添加必要的.NET程序集引用
如果是WCF服务,你的项目需要引用System.ServiceModel等程序集,在CMake中可以通过VS_DOTNET_REFERENCES属性添加:
set_property(TARGET YourCSharpApp PROPERTY VS_DOTNET_REFERENCES "System" "System.Core" "System.ServiceModel" "System.Xml" # ... 其他需要的引用,和原来VS项目保持一致 )
额外注意事项
- 多WSDL文件处理:如果有多个WSDL,用
foreach循环遍历文件列表,批量生成代理类 - 配置文件:如果生成了App.config,记得把它复制到输出目录(可以用
add_custom_command的POST_BUILD事件) - 工具版本:确保使用的工具版本和原来VS项目的.NET框架版本匹配,避免生成不兼容的代码
这样配置后,CMake构建时就会自动生成服务代理类,效果和VS里的“添加服务引用”完全一致。
内容的提问来源于stack exchange,提问作者ooak
相关产品推荐
相关产品推荐

