最近在排查一個奇怪的 EF Core 查詢速度慢的問題,須要在 corefx 2.2.3 的 System.Data.SqlClient 源碼中打點。git
github 上籤出 corefx 的源代碼,運行 build.cmd 命令,而後用 VS2017 打開 System.Data.SqlClient.sln ,添加 Console.WriteLine 打點代碼,用 VS 進行 build 。github
build 以後 corefx 根路徑下 bin\Windows_NT.AnyCPU.Debug\System.Data.SqlClient\netstandard 文件夾中會生成 System.Data.SqlClient.dll 文件,但這個 dll 在 Linux 上沒法使用(錯誤以下)。app
The type initializer for 'System.Data.SqlClient.SNILoadHandle' threw an exception. ---> System.DllNotFoundException: Unable to load shared library 'sni.dll' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libsni.dll: cannot open shared object file: No such file or directory at System.Data.SqlClient.SNINativeMethodWrapper.SNIInitialize(IntPtr pmo)
而 bin\AnyOS.AnyCPU.Debug 中沒有生成 System.Data.SqlClient.dll 。ide
改用 build-managed.cmd 命令 build :ui
build-managed.cmd -Project=src\System.Data.SqlClient\src
出現下面的錯誤提示spa
error CS1069: The type name 'Console' could not be found in the namesp ace 'System'. This type has been forwarded to assembly 'System.Console, Version=0.0.0.0, Culture=neutral, PublicKeyToke n=b03f5f7f11d50a3a' Consider adding a reference to that assembly.
在 System.Data.SqlClient.csproj 中添加 System.Console 的引用後消除了上面的錯誤提示。code
<ItemGroup Condition="'$(TargetGroup)' == 'netcoreapp'"> <Reference Include="System.Console" /> <Reference Include="System.Runtime.Extensions" /> <Reference Include="System.Data.Common" /> <Reference Include="System.ComponentModel.Primitives" /> <Reference Include="System.Xml.ReaderWriter" /> <Reference Include="System.Runtime.InteropServices" /> </ItemGroup>
但 build 結果與 Visual Stuido 同樣,得不到 Linux 版的 System.Data.SqlClient.dll 。blog
到 Linux 機器上試了試,運行 ./build-managed.sh 命令後會在 bin/AnyOS.AnyCPU.Debug 文件夾中生成 System.Data.SqlClient.dll ,原來要獲得 Linux 上可用的 System.Data.SqlClient.dll 須要 build 輸出到 bin/AnyOS.AnyCPU.Debug 文件夾。ci
但 Linux 上 build 有個問題,每次修改代碼後 build 總會出現下面的錯誤:get
/root/corefx/Tools/sign.targets(113,5): error : /root/corefx/bin/obj/ref/Microsoft.CSharp/4.0.0.0/netstandard/Microsoft.CSharp.dll: PE file is already strong-name signed. [/root/corefx/src/Microsoft.CSharp/ref/Microsoft.CSharp.csproj]
須要運行 ./build-managed.sh -CleanAllProjects 命令才能消除這個錯誤。
繼續回到 Windows 上,運行 build-managed.cmd -? 命令仔細看了一下命令參數,發現了 -OSGroup 參數
[-OSGroup] Sets the OS for the BuildConfigurtation you want to build. => Default value: ${OSName} => Legal values: [Windows_NT, Unix, Linux, OSX, FreeBSD, NetBSD].
因而使用下面的命令進行 build
build-managed.cmd -OSGroup=Linux
這樣 build 後會在 bin 中多了 Linux.AnyCPU.Debug 與 Unix.AnyCPU.Debug 文件夾, Linux 上可用的 System.Data.SqlClient.dll 就在 Unix.AnyCPU.Debug 文件夾中。