最近在排查一个奇怪的 EF Core 查询速度慢的问题,需要在 corefx 2.2.3 的 System.Data.SqlClient 源码中打点。

github 上签出 corefx 的源代码,运行 build.cmd 命令,然后用 VS2017 打开 System.Data.SqlClient.sln ,添加 Console.WriteLine 打点代码,用 VS 进行 build 。

build 之后 corefx 根路径下 bin\Windows_NT.AnyCPU.Debug\System.Data.SqlClient\netstandard 文件夹中会生成 System.Data.SqlClient.dll 文件,但这个 dll 在 Linux 上无法使用(错误如下)。

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 。

改用 build-managed.cmd 命令 build :

build-managed.cmd -Project=src\System.Data.SqlClient\src

出现下面的错误提示

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 的引用后消除了上面的错误提示。

<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 。

到 Linux 机器上试了试,运行 ./build-managed.sh 命令后会在 bin/AnyOS.AnyCPU.Debug 文件夹中生成 System.Data.SqlClient.dll ,原来要得到 Linux 上可用的 System.Data.SqlClient.dll 需要 build 输出到 bin/AnyOS.AnyCPU.Debug 文件夹。

但 Linux 上 build 有个问题,每次修改代码后 build 总会出现下面的错误:

/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 文件夹中。

Windows 上编译 corefx 源码生成 Linux 上可用的 System.Data.SqlClient.dll的更多相关文章

  1. [原]在win上编译 subversion 源码实践Tonyfield的专栏

    (百度和网页的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。) [原]在win上编译 subversion 源码实践 2013-6-9阅读400 评论0 (参考 ...

  2. 在ubuntu16.04上编译android源码【转】

    本文转载自:http://blog.csdn.net/fuchaosz/article/details/51487585 1 前言 经过3天奋战,终于在Ubuntu 16.04上把Android 6. ...

  3. 【转】Ubuntu10.04上编译Android源码(Build Android source in Ubuntu10.04 Platform)

    原文网址:http://blog.csdn.net/chenyafei617/article/details/6570928 一.Introduction 今天我们就来谈谈如何在Ubuntu平台上面编 ...

  4. 在Mac mini上编译Android源码

    参考文章 1.Android 6.0 源代码编译实践 2.编译Android源码致命错误解决方案 实践过程 1.Mac下安装Ubuntu双系统 (1)Ubuntu版本:Ubuntu 15.10 注:实 ...

  5. Windows下编译live555源码

    Windos下编译live555源码 环境 Win7 64位 + VS2012 步骤 1)源码下载并解压 在官网上下载最新live555源码,并对其进行解压. 2)VS下建立工程项目 新建Win32项 ...

  6. CentOS6.5上编译OpenJDK7源码

    本文地址:http://www.cnblogs.com/wuyudong/p/build-openjdk7.html,转载请注明源地址. 采用开源的OpenJDK版本,获取其源码的方式有两种: 通Me ...

  7. ant编译solr源码生成eclipse项目,解决一直resolve,一直[ivy:retrieve]的问题

    这两天在学习solr,结果刚到编译solr源码就卡住了,足足卡了两天,网上找各种解决办法都是简单带过,说是缺少jar包,下载下来放到对应位置就好了....对应位置???咋不说这个问题用相应方法解决即可 ...

  8. Nginx (一)Windows下编译Nginx源码以及安装 nginx for windows方法步骤

    转载自: http://apps.hi.baidu.com/share/detail/11192699#content Nginx介绍: Nginx ("engine x")是一个 ...

  9. <转>windows下编译lua源码

    因为之前一直使用 lua for windows 来搭建lua的使用环境,但是最新的 lua for windows 还没有lua5.2,我又想用这个版本的lua,所以被逼无奈只能自己编一下lua源码 ...

随机推荐

  1. ES6走一波 数组的扩展

    Array flat 数组实例的扁平化方法(浏览器支持不佳) 建议使用 lodash的 flatten

  2. GPS车辆监控系统的启动方式

    我们通常用到的GPS车辆监控系统都有哪些启动方式,又有什么区别呢?通常GPS车辆监控系统都有热启.冷启.温启的技术指标,现参考如下:GPS开机定位分为冷启动.温启动和热启动三种:一.冷启动:以下几种情 ...

  3. 【原创】大数据基础之ElasticSearch(2)常用API整理

    Fortunately, Elasticsearch provides a very comprehensive and powerful REST API that you can use to i ...

  4. JS函数可以再添加属性(包括方法)

    1 前言 JS函数可以再添加属性(包括方法),这个有点有趣,记录一下. 2 代码 <!DOCTYPE html> <html> <head> <title&g ...

  5. FastDFS使用

    1.在linux系统中安装FastDFS服务image-server.7z 2.导入FastDFS jar包 fastdfs_client_v1.20.jar 3.创建配置文件fastdfs_clie ...

  6. greenplum加密

    --如下为greenplum5.0数据库加解密--加密函数select encrypt('123456','aa','aes');--加解密函数select convert_from(decrypt( ...

  7. 两个c语言结构体复制的问题

    以前一直以为结构体要通过memcpy来复制,现在才明白可直接用“=”复制 C语言中,结构体是一篇连续的内存空间,使用=赋值操作,底层用到的就是memcpy:如果结构体中有指针变量:操作后.两个指针指向 ...

  8. Leetcode | 组目录

    数组 [1]999. 车的可用捕获量 [2]989. 数组形式的整数加法

  9. Postgresql查询出换行符和回车符:

    1.有时候,业务因为回车和换行出现的错误,第一步,首先要查询出回车符和换行符那一条数据: -- 使用chr()和chr()进行查询 SELECT * )||)||'%'; -- 其实查询chr()和c ...

  10. 如何解决 kubernetes 重启后,启来不来的问题

    参考了 https://blog.csdn.net/nklinsirui/article/details/80855415 最近在调研 kubeneter ,准备把线上的服务器架构再调整下,然后模拟各 ...