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

VS中SQL Server数据库项目如何让SQL脚本生成在ILMerge合并后执行

SQL Server数据库项目ILMerge合并后生成dacpac的构建流程调整方案

我在Visual Studio的解决方案内有一个SQL Server数据库项目及多个依赖项目,编译该数据库项目时默认会输出SQL脚本与.dacpac文件。我的需求是通过ILMerge.MSBuild.Tasks.ILMerge将所有依赖项目的dll合并为单个dll后,再基于合并后的dll生成对应的SQL脚本和.dacpac文件。

最初我将ILMerge逻辑配置在sqlproj文件的AfterBuild事件中,但合并操作执行时机晚于SQL脚本生成步骤,无法达到需求。

初始构建日志

2>------ Rebuild All started: Project: TestCLR, Configuration: Debug Any CPU ------
2>      D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn\csc.exe /noconfig /nowarn:1701,1702,2008 /fullpaths /nostdlib+ /errorreport:prompt /warn:4 /define:DEBUG;TRACE /errorendlocation /preferreduilang:en-US /highentropyva+ /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\mscorlib.dll" /reference:D:\Work\FF\Sql-Objects\Tools\TestCLR\bin\Debug\TestLogic.dll /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Data.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Xml.dll" /debug+ /debug:full /optimize- /out:obj\Debug\TestCLR.dll /subsystemversion:6.00 /target:library /warnaserror- /utf8output /langversion:7.3 TestProcedures.cs 
2>      Loading project references...
2>      Loading project files...
2>      Building the project model and resolving object interdependencies...
2>      Validating the project model...
2>      Writing model to D:\Work\FF\Sql-Objects\Tools\TestCLR\obj\Debug\Model.xml...
2>      Writing create script to TestCLR_Create.sql...
2>      TestCLR -> D:\Work\FF\Sql-Objects\Tools\TestCLR\bin\Debug\TestCLR.dll
2>      TestCLR -> D:\Work\FF\Sql-Objects\Tools\TestCLR\bin\Debug\TestCLR.dacpac
2>      ILMerge bin\Debug\TestCLR.dll;bin\Debug\TestLogic.dll;bin\Debug\Sider.dll -> D:\Work\FF\Sql-Objects\Tools\TestCLR\bin\Debug\TestCLR.dll
========== Rebuild All: 2 succeeded, 0 failed, 0 skipped ==========

初始ILMerge配置(位于sqlproj的</Project>标签前)

<UsingTask TaskName="ILMerge.MSBuild.Tasks.ILMerge" AssemblyFile="$(SolutionDir)\packages\ILMerge.MSBuild.Tasks.1.0.0.3\tools\ILMerge.MSBuild.Tasks.dll" />
<Target Name="AfterBuild">
  <ItemGroup>
    <MergeAsm Include="bin\Debug\*.dll" />
  </ItemGroup>
  <PropertyGroup>
    <MergedAssembly>$(ProjectDir)$(OutDir)RedisCLR.dll</MergedAssembly>
  </PropertyGroup>
  <Message Text="ILMerge @(MergeAsm) -> $(MergedAssembly)" Importance="high" />
  <ILMerge InputAssemblies="@(MergeAsm)" OutputFile="$(MergedAssembly)" TargetKind="SameAsPrimaryAssembly" />
</Target>

第一次调整遇到的问题

我尝试修改构建依赖顺序,让ILMerge在SQL生成步骤前执行,配置如下:

<PropertyGroup>
  <SqlBuildDependsOn>
    BeforeSqlBuild;
    $(SqlBuildDependsOn);
  </SqlBuildDependsOn>
</PropertyGroup>
<Target Name="BeforeSqlBuild">
  <!-- ILMerge逻辑 -->
</Target>

该方案触发了新问题:依赖项目的dll会在构建流程接近PostBuildEvent的阶段才输出到Bin\debug目录,提前执行ILMerge会报错找不到待合并的dll。

最终解决方案

调整ILMerge的dll收集路径,不从输出的bin目录取文件,改为从obj文件夹和依赖项目的构建输出路径直接收集待合并的dll,即可解决路径找不到的问题,同时满足「先合并dll,再生成SQL脚本和dacpac」的需求。


内容的提问来源于stack exchange,提问作者Viktor Bardakov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 18:24:01