0%

什么是NetCDF

NetCDF(网络公用数据格式)是一种用来存储温度、湿度、气压、风速和风向等多维科学数据(变量)的文件格式。
NetCDF包含以下特性

  • 自描述性,即 netCDF 文件包括关于其中所含数据的信息,如捕获数据元素的时间以及使用的测量单位。
  • 可移植性,或称跨平台性,即在一种操作系统上创建的 netCDF 文件通常可被其他操作系统上的软件读取。
  • 可扩展性,即可有效地读取一个大 netCDF 文件的一个小子集,而无需读取整个文件。
    在ArcGis中可以使用Netcdf数据。

NETCDF的基本结构

  • 维度(Dimensions)

    NetCDF 维度包含名称和大小。维度大小是一个任意的正整数。每个 NetCDF 文件中只有一个维度的大小是“无限制”的。这类维度是无限维度或记录维度。无限维度的变量可以沿着该维度增加到任意长度。

  • 变量(Variables)

    变量代表相同类型的值数组。变量用来存储 NetCDF 文件中的大部分数据。变量具有名称、数据类型以及在创建该变量时指定的维度列表所描述的 shape。维度数称为秩(或维数)。标量变量的秩为 0,矢量的秩为 1,矩阵的秩为 2。变量还可以具有能够在变量创建后进行添加、删除或更改的相关属性。

  • 坐标变量()

    与维度同名的一维变量称为坐标变量。坐标变量与一个或多个数据变量的维度相关,通常用来定义与该维度相对应的物理坐标。

    坐标变量对于 NetCDF 库来说没有特殊意义。但使用这个库的软件会采用一种特殊的方式来处理坐标变量。

  • 属性(Attributes)

    NetCDF 的属性用于存储辅助数据或元数据。大部分属性提供有关特定变量的信息。这些属性由变量名称与属性名称共同标识。

  • 约定(Conventions)

    约定用来定义为每个变量中的数据提供确切描述的元数据及其空间和时态属性。约定有助于使用不同数据源的用户确定哪些量具有可比性。约定名称在 NetCDF 文件中以全局属性的形式表示。

    目前,ArcGIS 支持气候和预测 (CF) 以及海洋/大气合作研究数据服务 (COARDS) 约定。然而,它可能也支持采用其他约定创建的 NetCDF 文件。

  • 存储结构如下图所示

    3d
    4d

  • 采用 CDL(网络公用数据格式语言)表示法来描述的 NetCDF 文件结构

    4d

如何创建或读取netcdf数据

参考官方文档https://www.unidata.ucar.edu/software/netcdf/docs/index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//定义维度 当len为0L时,创建不定长度维度,每个变量只允许有一个。
public static extern int nc_def_dim(int ncid, string name, int len, out int dimidp);
//定义变量
public static extern int nc_def_var(int ncid, string name, NcType xtype, int ndims, int[] dimids, out int varidp);
//整体写入变量
public static extern int nc_put_var_int(int ncid, int varid, int[] data);
public static extern int nc_put_var_int(int ncid, int varid, int[,] data);
//写入单条数据
public static extern int nc_put_var1_int(int ncid, int varid, int[] indexp, int data);
//写入部分数据
public static extern int nc_put_vara_int(int ncid, int varid, int[] startp, int[] countp, int[] data);
//未知
public static extern int nc_put_varm_int(int ncid, int varid, int[] startp, int[] );
public static extern int nc_put_vars_int(int ncid, int varid, int[] startp, int[] countp, int[] stridep, int[] data);
///压缩算法,shuffle辅助压缩算法,defalte是否压缩deflate_level压缩等级
public static extern int nc_def_var_deflate(int ncid, int varid, int shuffle, int deflate, int deflate_level);
//加入属性 当varid为-1时,将加入全局属性
public static extern int nc_put_att_text(int ncid, int varid, string name, int len, string tp);

如何创建CF COARDS约定的数据集

按照以下格式创建的NC为CF1.0约定的数据集文件

cf-1.0

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public bool TifToNC3DSingleVarByYear(string TifPath, string NcPath, int year)
{
bool flag = false;
try
{
List<String> tifList = Directory.GetFiles(TifPath, "*.tif").ToList();
Dataset dataset = Gdal.Open(tifList[0], Access.GA_ReadOnly);
int width = dataset.RasterXSize;
int heigh = dataset.RasterYSize;
int timeCount = tifList.Count;
//创建nc文件
int ncid;
int result = NetCDF.nc_create(NcPath, NetCDF.CreateMode.NC_NETCDF4, out ncid);
//创建维度
int lonDimidp;
result = NetCDF.nc_def_dim(ncid, "longitude", width, out lonDimidp);
int latDimidp;
result = NetCDF.nc_def_dim(ncid, "latitude", heigh, out latDimidp);
result = NetCDF.nc_def_var(ncid, "longitude", NetCDF.NcType.NC_FLOAT, 1, new int[] { lonDimidp }, out int lonVaridp);
result = NetCDF.nc_def_var(ncid, "latitude", NetCDF.NcType.NC_FLOAT, 1, new int[] { latDimidp }, out int latVaridp);
float[] lon = new float[7200];
for (int i = 0; i < 7200; i++)
{
lon[i] = -180 + 0.05f * i;
}
float[] lat = new float[3600];
for (int i = 0; i < 3600; i++)
{
lat[i] = 90 - 0.05f * i;
}
NetCDF.nc_put_var_float(ncid, lonVaridp, lon);
NetCDF.nc_put_att_text(ncid, lonVaridp, "units", "degrees_east".Length, "degrees_east");
NetCDF.nc_put_att_text(ncid, lonVaridp, "long_name", "longitude".Length, "longitude");
NetCDF.nc_put_var_float(ncid, latVaridp, lat);
NetCDF.nc_put_att_text(ncid, latVaridp, "units", "degrees_north".Length, "degrees_north");
NetCDF.nc_put_att_text(ncid, latVaridp, "long_name", "latitude".Length, "latitude");
result = put_var_year("time", "snw", tifList, ref dataset, ncid, lonDimidp, latDimidp);
result = NetCDF.nc_close(ncid);
flag = true;
}
catch (Exception ex)
{
flag = false;
}
return flag;
}

private int put_var_year(string dimname, string varname, List<string> tifList, ref Dataset dataset, int ncid, int lonDimidp, int latDimidp)
{
tifList = tifList.OrderBy(p => p).ToList();
int timeCount = tifList.Count;
int[] time = new int[timeCount];
string timeStr = Path.GetFileName(tifList[0]).Split("_")[3];
DateTime firstDay = DateTime.ParseExact(timeStr, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture);
int firstDaysInt = (firstDay - new DateTime(1900, 1, 1)).Days;
for (int i = 0; i < timeCount; i++)
{
time[i] = i + firstDaysInt;
}
int result;
int timeDimidp;
result = NetCDF.nc_def_dim(ncid, dimname, timeCount, out timeDimidp);
result = NetCDF.nc_def_var(ncid, dimname, NetCDF.NcType.NC_INT, 1, new int[] { timeDimidp }, out int timeVaridp);
NetCDF.nc_put_var_int(ncid, timeVaridp, time);
NetCDF.nc_put_att_text(ncid, timeVaridp, "units", "days since 1900-01-01 00:00:0.0".Length, "days since 1900-01-01 00:00:0.0");
NetCDF.nc_put_att_text(ncid, timeVaridp, "long_name", dimname.Length, dimname);
NetCDF.nc_put_att_text(ncid, timeVaridp, "calendar", "gregorian".Length, "gregorian");
int varidp;
int[] dimids = new int[3];
dimids[0] = timeDimidp;
dimids[1] = latDimidp;
dimids[2] = lonDimidp;
result = NetCDF.nc_def_var(ncid, varname, NetCDF.NcType.NC_BYTE, 3, dimids, out varidp);
//加入压缩算法
result = NetCDF.nc_def_var_deflate(ncid, varidp, 0, 1, 5);
result = NetCDF.nc_enddef(ncid);
LongArray<byte> buffer = new LongArray<byte>(timeCount * 3600L * 7200L);
for (int i = 0; i < timeCount; i++)
{
dataset = Gdal.OpenShared(tifList[i], Access.GA_ReadOnly);
Band srcBand = dataset.GetRasterBand(1);
//读取数据为数组的数组
int[,] writeBuffer = ReadBandToArray<int>(srcBand);
//值转换
for (int m = 0; m < 3600; m++)
{
for (int n = 0; n < 7200; n++)
{
if (writeBuffer[m, n] == 200)
buffer[i*3600L*7200L+m*7200L+n] = 1;
}
}
}
result = NetCDF.nc_put_var_ubyte(ncid, varidp, buffer._getAddress(0));
buffer.Dispose();
return result;
}

工程文件的迁移

迁移相关要点

NetFramework项目默认采用.csproj(旧版格式)文件作为工程文件。
Visual Studio 2015及以前NetCore项目采用 .xproj + project.json 方式作为工程配置文件。
自Visual Studio 2017开始, NetCore项目迁移至.csproj(新版格式)文件作为工程文件。
自Visual Studio 2017开始, 支持将Nuget的package.json迁移至PackageReference,并不改变.csproj风格。

如何迁移

使用github开源项目 https://github.com/hvanbakel/CsprojToVs2017.git
根据Readme.md教程操作

概述

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

安装

Linux下安装

1
yum install nginx

配置

nginx的配置目录如下所示

nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#user  nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}


# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;

# location / {
# root html;
# index index.html index.htm;
# }
#}


# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;

# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;

# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;

# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;

# location / {
# root html;
# index index.html index.htm;
# }
#}

}

NPM包管理器概述

NPM(Node Package Manager,即:node包管理器)是nodeJS的一个程序包管理和分发的管理工具,npm完全用JavaScript写成,它可以让全世界与Web前端相关开发者共享代码,非常方便的使用各种插件、库和框架,无需再到处去搜寻需要用到的这些程序。

NPM的安装

NPM原本是Node的单独项目,现已被集成至NodeJS中,只要安装了NodeJS就可以使用NPM了。

package.json

NPM的操作与pakage.json密切相关,NPM实际维护了一个package.json的文件,其内容格式如下所示,示例为一个Vue项目的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
{
"name": "nodeweb",
"version": "1.0.0",
"description": "A Vue.js project",
"author": "** <**@piesat.cn>",
"private": true,
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"build": "node build/build.js"
},
"dependencies": {
"cesium": "^1.67.0",
"view-design": "^4.1.3",
"vue": "^2.5.2"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-loader": "^7.1.1",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-plugin-transform-vue-jsx": "^3.5.0",
"babel-preset-env": "^1.3.2",
"babel-preset-stage-2": "^6.22.0",
"chalk": "^2.0.1",
"copy-webpack-plugin": "^4.0.1",
"css-loader": "^0.28.0",
"extract-text-webpack-plugin": "^3.0.0",
"file-loader": "^1.1.4",
"friendly-errors-webpack-plugin": "^1.6.1",
"html-webpack-plugin": "^2.30.1",
"node-notifier": "^5.1.2",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^1.2.0",
"portfinder": "^1.0.13",
"postcss-import": "^11.0.0",
"postcss-loader": "^2.0.8",
"postcss-url": "^7.2.1",
"rimraf": "^2.6.0",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"uglifyjs-webpack-plugin": "^1.1.1",
"url-loader": "^0.5.8",
"vue-loader": "^13.3.0",
"vue-style-loader": "^3.0.1",
"vue-template-compiler": "^2.5.2",
"webpack": "^3.6.0",
"webpack-bundle-analyzer": "^2.9.0",
"webpack-dev-server": "^2.9.1",
"webpack-merge": "^4.1.0"
},
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
  • scripts
    使用npm run 命令可以快速运行scripts中的脚本,完全的自由控制。
  • dependencies
    为了项目整洁,此项下一般存放项目中实际发布时要用的包的依赖信息。
  • devDependencies
    存放开发时的一切辅助用的包,如webpack。

NPM常用命令

  1. 安装cnpm
1
npm install -g cnpm --registry=https://registry.npm.taobao.org
  1. 全局安装模块
1
npm install -g webpack 
  1. 安装开发版模块
1
2
3
npm install webpack --save-dev

npm i webpack -D
  1. 安装package.json中的包
1
cnpm install

webpack

entry

每个entry属性,对应一个入口文件,便于单页,多页面应用的JS引入。

1
2
3
4
5
6
7
8
9
10
11
//单页入口
entry:{
main:'./src/index'
}
//单页入口简写
entry:'./src/index'
//多入口
entry:{
one:'./src/one/index.js',
two:'./src/two/index.js'
}

output

1
2
3
4
5
//单入口
output:{
path:path.resolve(__dirname,'dist')
filename:bundle.js
}

exports 和 module.exports

Node.js本身提供了很多核心模块 ,这些核心模块被编译成二进制文件,可以require(‘模块名’)去获取;核心模块具有最高的加载优先级(有模块与核心模块同名时会体现),如:

1
2
3
4
5
6
//
var fs = require('fs')
var http = require('http')
var myadd = require('./add')//本目录下的add.js
var myadd = require('../add')//相对路径加载
var myadd = require('/add')//绝对路径加载

核心模块(Core Modules)

核心模块总是被优先加载

loader

用于对模块的源代码进行转化

在VSCode中调试NodeJs

在VSCode工作空间中新建一下文件并在图示位置打入断点,并按F5会如下图所示自动进入断点,并且左侧栏中包含了调试的全局与本地变量,自定义监视,调用堆栈等栏目。

vscode_debugger

在下侧调试控制台中可见,VSCode已经自动针对JS文件自动执行了Node.exe并加入了调试选项 inspect,此时node.js已经开启了一个websocket的调试通信,打开以下地址 http://127.0.0.1:6468/2e6c70f5-70a3-49e5-831c-dd036323ed8f 如图所示。

vscode_debugger

SSL是什么?

SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。

OpenSSL又是什么?

在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。

下载地址

https://oomake.com/download/openssl

使用方法

  1. Win64直接安装
  2. 打开PowerShell 或CMD输入以下命令
1
openssl req -newkey rsa:2048 -nodes -keyout cas.clientservice.key -x509 -days 365 -out cas.clientservice.cer

按照提示输入信息,默认连续回车也可。
Windows下运行以上命令报以下错误

1
2
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
Unable to load config info from /usr/local/ssl/openssl.cnf

上述错误明显是在Linux下的路径,可能为环境变量造成的,查阅资料添加以下环境变量

1
OPENSSL_CONF=C:\OpenSSL-Win64\bin\cnf\openssl.cnf

也可以在打开CMD时设置临时变量

1
set OPENSSL_CONF=C:\OpenSSL-Win64\bin\cnf\openssl.cnf
  1. 下面将生成的证书和Key封装成一个文件,以便IdentityServer可以使用他们正确的签名tokens。
1
openssl pkcs12 -export -in cas.clientservice.cer -inkey cas.clientservice.key -out cas.clientservice.pfx

按照提示输入Export Password 记住这个Password 将来会有用。
完成后将生成如下三个文件。
cas.clientservice.cer cas.clientservice.key cas.clientservice.pfx
·

安装Oracle11g

  1. 拉取镜像
    1
    docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
  2. 创建容器
    1
    docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
  3. 进入镜像进行配置
    1
    docker exec -it oracle11g bash
  4. 切换用户
    1
    su root
         密码:helowin
    
  5. 编辑文件
    1
    2
    3
    4
    5
    vim /etc/profile

    export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
    export ORACLE_SID=helowin
    export PATH=$ORACLE_HOME/bin:$PATH
  6. 创建软连接
    1
    ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
  7. 切换到oracle用户
    1
    su - oracle
  8. 登录sqlplus修改sys密码
    1
    2
    3
    4
    5
    sqlplus /nolog
    conn /as sysdba

    alter user system identified by system;
    alter user sys identified by sys;
  9. 创建用户
    1
    create user test identified by test;
  10. 赋权
    1
    grant connect,resource,dba to test;

网络配置

一、tnsnames.ora(本地网络服务名配置)文件详解

tnsnames.ora:位于客户端,用于配置客户端连接服务端数据库连接信息。客户端服务配置信息包括:服务器地址、服务名称(数据库实例)、端口号。属于命名方法中的一种,
1
2
3
4
5
6
7
8
9
SJZX =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)

二、listener.ora(监听程序配置)文件详解

listener.ora:位于服务器端,用于时时监听客户端请求。
监听器位于服务器端,主要信息包括监听协议(TCP/IP协议)、地址。
1
2
3
查看监听状态:lsnrctl status
启动监听:lsnrctl start
停止监听: lsnrctl stop
1
2
3
4
LISTENER =
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
(ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY)))

三、sqlnet.ora(命名方法配置)文件详解

sqlnet.ora:配置连接数据库的方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
OS认证:oracle对操作系统登录用户身份的识别
SQLNET.AUTHENTICATION_SERVICES=(NTS)
则说明可以使用OS认证(oracle systerm certification)就只要conn / as sysdba 就可以登陆
但如果注释掉或SQLNET.AUTHENTICATION_SERVICES=(none)
必须要使用conn scott/scott@localhost:1521/orcl才能登陆

1、在windows下,SQLNET.AUTHENTICATION_SERVICES必须设置为NTS或者 ALL才能使用OS认证;不设置或者设置为其他任何值都不能使用OS认证。
2、在linux下,在SQLNET.AUTHENTICATION_SERVICES的值设置为ALL,或者不设置的情况下,OS验证才能成功;设置为 其他任何值都不能使用OS认证。

NAMES.DIRECTORY_PATH= (TNSNAMES,ezconnect)
ezconnect简单连接 :
conn scott/scott@orcl 可以直接连接
TNSNAMES 本地命名连接:
类似conn scott/scott@orcl的连接方式,需要客户端配置一个本地命名解析文件,
为$ORACLE_HOME\NETWORK\ADMIN\tnsnames.ora文件,可以使用netca配置。

数据管理

一、创建表空间

1
2
3
4
5
6
CREATE TABLESPACE XSDC
DATAFILE 'C:\app\Oracle\oradata\orcl\XSDC.DBF'
SIZE 50M
AUTOEXTEND ON
NEXT 50M MAXSIZE 2048M
EXTENT MANAGEMENT LOCAL

二、创建用户

1
2
3
4
5
6
CREATE USER XSDC
IDENTIFIED BY "XSDC"
DEFAULT TABLESPACE XSDC
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
QUOTA UNLIMITED ON XSDC

三、分配权限

1
GRANT ALL PRIVILEGES TO XSDC

什么是VC?

Microsoft Visual C++ 2008 Redistributable Package (x86) 会为 Visual C++ 库安装必要的运行时组件,使用户能够在未安装 Visual C++ 2008 SP1 的计算机上运行使用 Visual C++ SP1 开发的应用程序。
此软件包安装 C 运行时 (CRT)、标准 C++、ATL、MFC、OpenMP 和 MSDIA 库的运行时组件。对于支持并行部署模型的库(CRT、SCL、ATL、MFC、OpenMP),这些运行时组件被安装到支持并行程序集的 Windows 操作系统的本机程序集缓存(也称为 WinSxS 文件夹)中

MSVC++版本 MSC_VER VS版本 平台工具集版本
VC6 1200 VC6.0
VC7 1300 VS2002
VC7.1 1310 VS2003
VC8 1400 VS2005
VC9 1500 VS2008
VC10 1600 VS2010
VC11 1700 VS2012
VC12 1800 VS2013
VC13 1900 VS2014
VC14 VS2015
VC15 VS2017 v141
VC16 VS2019 v142