CharlesChen's Technical Space

简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)
Not the best, only better
随笔 - 135, 文章 - 0, 评论 - 547, 阅读 - 51万
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

摘要: 阅读全文

posted @ 2016-11-14 22:28 Charles Chen 阅读(987) 评论(0) 推荐(0) 编辑

摘要: 1、 C#事件是特殊的委托 2、 C#中使用委托模型来实现事件的。 3、 C#中的委托是一个引用类型,可以把它看成一个特殊的”类”。 阅读全文

posted @ 2010-07-08 11:03 Charles Chen 阅读(6824) 评论(25) 推荐(5) 编辑

摘要: 一位同事在使用XmlDocument.Load("test.xml")方法加载xml文件时候,出现错误,错误是:test.xml文件找不到,也就是说程序找不到test.xml文件。 阅读全文

posted @ 2010-05-13 22:46 Charles Chen 阅读(2319) 评论(2) 推荐(2) 编辑

摘要: 记得已经写过一篇关于(Observer模式), http://www.cnblogs.com/Charles2008/archive/2008/10/06/1305116.html 发布/订阅简称(Pub/Sub)模式,这种Pub/Sub设计模式是observer的一种变体。Observer模式在Design patterns用于:一个对象(Observer)观察者被注入到另一个对象(主题Subj... 阅读全文

posted @ 2009-03-07 15:17 Charles Chen 阅读(9140) 评论(0) 推荐(0) 编辑

摘要: 在项目中常常需要这样的功能:把RadioButton控件放到GridView(容器)控件中,设置GroupName为固定的一个值的时候实现单选功能,但是当最终生成HTML页面的时候,生成的Name会用 INamingContainer的规则自动生成不同的Name,就不能达到实现单选的效果。 (Name不唯一造成) 阅读全文

posted @ 2008-12-11 09:17 Charles Chen 阅读(5514) 评论(11) 推荐(0) 编辑

摘要: .net下关于上传文件解决方案比较和探讨 下面是一些解决方案,能力有限,希望朋友们提出宝贵的意见以及更好的解决方案:欢迎朋友们指正。谢谢! 阅读全文

posted @ 2008-10-21 07:00 Charles Chen 阅读(2611) 评论(7) 推荐(0) 编辑

摘要: (Observer模式的扩展) 阅读全文

posted @ 2008-10-06 23:28 Charles Chen 阅读(1414) 评论(0) 推荐(0) 编辑

摘要: 在目前做的移动项目开发中,我负责了一个文件上传控件的开发。(效果图如上)在开发的过程中遇到了一些问题,但最后通过不段的查找和测试,终于把问题解决了。下面我把解决问题的思想记录下来,愿意和朋友们分享。当然也希望朋友们能提出其他的解决方案。共同交流。 阅读全文

posted @ 2008-07-20 16:32 Charles Chen 阅读(10802) 评论(9) 推荐(2) 编辑

摘要: 一、起因: 开发团队的一名开发人员突然离职,他把他负责的模块任务交给了我。其中一个模块是他写了一个用户控件,我在我的页面尚始终都用不起,运行时发生错误,错误消息是:The base class includes the field *****, but its type (****) is not compatible with the type of control (ASP.webuserc... 阅读全文

posted @ 2008-06-27 14:02 Charles Chen 阅读(3116) 评论(10) 推荐(1) 编辑

摘要: 最近比较空闲,我喜欢在空闲的时间来总结总结新的知识。记得一个项目中要实现Google Map中搜索功能。通过在网上查阅相关资料。原来是要使用GoogleMap提供的API函数来实现。下面我用GoogleMap来实现以个简单的Map,可以通过某个地区的经纬度来查询城市的地理位置。(支持缩放,移动等功能) 纬度 经度 源文件下载: 点击下载 阅读全文

posted @ 2008-03-03 10:54 Charles Chen 阅读(1968) 评论(6) 推荐(0) 编辑

2017年12月11日

本文转载   https://walterlv.github.io/dotnet/2017/09/22/dotnet-version.html ,感谢  吕毅 (包含链接: https://walterlv.github.io )

当我们编译程序目标框架选为 .Net Framework 4.5/4.6/4.7 时,CLR 运行时是如何判断我们究竟应该用哪一个 .Net Framework 呢?.Net Framework 的版本到底由哪些部分组成?我们编译 .Net Framework 时选择的版本决定了什么?


让我对这个问题产生兴趣的原因是:

  • 我将程序编译的目标框架选为 .Net Framework 4.7;在一台安装了 .Net Framework 4.6 的电脑上提示缺少 .Net Framework 4.7;删除了随编译一起生成的 app.config 文件后程序能够正常运行。
  • 另一个程序,我明明将程序编译的目标框架选为 .Net Framework 4.5,但在一台没有安装任何额外 .Net Framework 的 Windows 7 的电脑上提示缺少的是 .Net Framework 4.0。

这里的疑点在于为什么以上两种看似类似的情况,提示的框架版本却不同。其中的 app.config 文件成为了调查此问题的突破口。

配置支持的运行时

观察程序附带的 app.config 文件,我们发现支持的运行时版本是 v4.0,sku 版本是 4.7。

<configuration>  
   <startup>  
      <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />  
   </startup>  
</configuration>  

疑点:

  1. 为什么我们基于 .Net Framework 4.7 开发的程序运行时版本是 4.0?
  2. sku 是什么?

微软的官方文档给了我们解答:supportedRuntime Element

  • version:用于指定此应用程序支持的公共语言运行时(CLR)的版本。
  • sku:stock-keeping unit(官方中文为“库存单位”,然而依然不懂这个词的意思),用于指定此应用程序支持的 .Net Framework 发行版本。

version 的值可取:

.NET Framework 版本version 值
忽略早期版本 忽略早期版本
2.0 “v2.0.50727”
3.0 “v2.0.50727”
3.5 “v2.0.50727”
3.5 “v2.0.50727”
4.0-4.7 “v4.0”

sku 的值可取:

.NET Framework versionsku 值
4.0 “.NETFramework,Version=v4.0”
忽略中间版本 忽略中间版本
4.5 “.NETFramework,Version=v4.5”
4.5.1 “.NETFramework,Version=v4.5.1”
4.5.2 “.NETFramework,Version=v4.5.2”
4.6 “.NETFramework,Version=v4.6”
4.6.1 “.NETFramework,Version=v4.6.1”
4.6.2 “.NETFramework,Version=v4.6.2”
4.7 “.NETFramework,Version=v4.7”

于是我们发现,其实无论我们将程序的目标框架选为 .Net Framework 的哪一个 4.x 版本,CLR 运行时都是用 v4.0 表示的。微软的描述是:

对于支持 .NET Framework 4.0 或更高版本的应用程序,version 属性指示 CLR 版本,这是 .NET Framework 4 及更高版本的通用版本,而 sku 属性指示应用程序所针对的单个 .NET Framework 版本。

其实看到这里我们就能有一个看似不错的解释:

  1. 无论我们选择的目标框架是 .Net Framework 4.x 的哪一个版本,用于指定 CLR 运行时版本的 version 值都是 v4.0;
  2. CLR 运行时会根据配置文件的 sku 值决定应该采用那一组运行库来为程序运行提供支持。

.Net Framework 的组成以及各部分的版本

我们需要寻找到 .Net Framework 的本质,不然如此错综复杂的版本号系统真把我搞懵了。

微软在 .NET Framework Versions and Dependencies 中说到:

每个版本的 .NET framework 都包含公共语言运行时 (CLR)、基础库和其他托管库。

于是我们谈论 .Net Framework 的版本其实应该分三个不同的部分来谈:

每个新版本的 .NET Framework 都会保留早期版本中的功能并会添加新功能。 CLR 有其自己的版本号标识。 虽然 CLR 版本并不总是递增的,但 .NET Framework 版本号在每次发布时都会递增。 例如,.NET Framework 4、4.5 和更高版本包含 CLR 4,而 .NET Framework 2.0、3.0 和 3.5 包含 CLR 2.0。 (没有版本 3 的 CLR。)

从官方文档给出的表格当中我们可以确信:.Net Framework 4.0/4.5/4.6/4.7 包含的 CLR 版本都是 4.0。

CLR 的更新

然而,不相信微软的 CLR 可以完全没有 BUG,既然 CLR 版本都是 4.0,那么微软对 CLR 运行时的更新怎么处理?安装了 .Net Framework 4.5/4.6/4.7 会如何提升 CLR 的稳定性和安全性?

在 Targeting and Running .NET Framework apps for version 4.5 and later 中,解释了 CLR 的更新机制——就地更新(in-place update)。这篇文章 .NET 4.5 is an in-place replacement for .NET 4.0 对这种就地更新方式有比官方文档更详细的解释,并且还附带自己的一些试验(含代码)。不过文章是 2012 年写的,部分结论现在看来已经过时(因为在我的 Windows 10 配 .Net Framework 4.7 上结论已经不一样),不过对我理解就地更新本身非常有帮助,也为后续调查提供了更清晰的思路。

微软对 .Net Framework 4.x 框架就地更新的说明是:

.NET Framework 4.5 是替代计算机上的 .NET Framework 4 的就地更新,同样,.NET Framework 4.5.1 4.5.2、4.6、4.6.1、4.6.2 和 4.7 是对 .NET Framework 4.5 的就地更新,这意味着它们将使用相同的运行时版本,但是程序集版本会更新并包括新类型和成员。 在安装其中某个更新后,你的 .NET Framework 4.NET Framework 4.5 或 .NET Framework 4.6 应用应继续运行,而无需重新编译。 但是,反过来则不行。

也就是说,无论我们在开发时指定目标框架的版本是 4.x 的哪一个,在运行时,CLR 环境都是 4.0。但是新的 .Net Framework 会带来更新版本的 CLR,这个 CLR 会直接替换掉旧的 CLR。.NET 4.5 is an in-place replacement for .NET 4.0 文章中 .Net Framework 基础库也是就地更新的;但我实际实验的情况是每一个不同的 .Net Framework 基础库有自己单独的文件夹,目前尚不清楚这个改变是从 .Net Framework 的哪一个版本开始的,但一定是 4.5.1、4.5.2、4.6 这三个版本中的一个。

每一个不同的 .Net Framework 基础库有自己单独的文件夹

解决一开始的疑问

于是,本文一开始的疑问就全部明晰了:

  1. 不管是 .Net Framework 4.5 的还是 4.7 的那两个程序,都是靠 4.0 版本的公共语言运行时(CLR)运行起来的;
  2. 如果没有安装 4.0 版本的 CLR,则会弹出提示需要安装 .Net Framework 4.0 版本才能运行,而不管我们的程序目标框架是 .Net Framework 4.x 的哪一个版本;
    • 虽然说文案说的是 .Net Framework,但其实需要的是 CLR
  3. 如果已经安装有 4.0 版本的 CLR(可能随 .Net Framework 4.5/4.6 安装),我们程序的目标框架是 .Net Framework 4.7,但 .Net Framework 基础库并没有安装 4.7 版本,则运行时会提示需要安装 .Net Framework 4.7;
    • 这个提示是 4.0 版的 CLR 弹出的,是根据 supportedRuntime 中指定的 sku 值来决定的

参考资料


本文会经常更新,请阅读原文: https://walterlv.github.io/dotnet/2017/09/22/dotnet-version.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

posted @ 2017-12-11 15:43 Charles Chen 阅读(1169) 评论(0) 推荐(1) 编辑

2017年5月23日

摘要: 本文转载于: http://www.cnblogs.com/zfanlong1314/p/3916047.html 阅读全文

posted @ 2017-05-23 14:39 Charles Chen 阅读(1553) 评论(0) 推荐(0) 编辑

摘要: 本文转载:http://www.cnblogs.com/Interkey/p/RunAsAdmin.html 在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录、 阅读全文

posted @ 2017-05-23 10:58 Charles Chen 阅读(718) 评论(0) 推荐(0) 编辑

2016年9月6日

摘要: public class FsnBizNet { private static int count; public static int parseInt(IList<string> list) { int value = Convert.ToInt32(list[count + 1] + list 阅读全文

posted @ 2016-09-06 23:08 Charles Chen 阅读(2531) 评论(0) 推荐(0) 编辑

2016年8月9日

摘要: 问题描述: 当客户服务器不允许直接备份时,往往通过导出数据库脚本的方式来部署-还原数据库, 但是当数据库导出脚本很大,用Microsoft SQL Server Management Studio执行脚本时,往往会遇到“内存不足”的提示。 解决办法: 用微软自带的sqlcmd工具,可以导入执行。以S 阅读全文

posted @ 2016-08-09 11:09 Charles Chen 阅读(2428) 评论(0) 推荐(0) 编辑

2016年6月13日

摘要: 1 引言 在应用程序的设计中,经常需要读取Excel数据或将Excel数据导入转换到其他数据载体中,例如将Excel数据通过应用程序导入SQL Sever等数据库中以备使用。笔者在开发“汽车产业链ASP协同商务平台”中遇到了类似需求。某汽车整车生产企业需要将其车辆发车信息发布到汽车产业链平台上去,其 阅读全文

posted @ 2016-06-13 18:19 Charles Chen 阅读(1099) 评论(0) 推荐(0) 编辑

2015年4月29日

摘要: 1、 背景:根据项目的要求,需要对配置文件配置的数据库连接字符串进行加密,也就是对ConnectinString节点的内容进行加密存储,同时考虑到代码使用连接字符串不需要进行更改,C#会自动对加密的内容进行解密。2、需求:因此考虑单独开发一个winform程序,对配置文件进行加密和解密,通过Conf... 阅读全文

posted @ 2015-04-29 17:20 Charles Chen 阅读(3729) 评论(0) 推荐(0) 编辑

2015年4月20日

摘要: 因项目中采用CS结构读取Web.config文件,故参照一下的连接完成此功能,在此感谢原作者!原文地址: http://www.cnblogs.com/zfanlong1314/p/3623622.html 阅读全文

posted @ 2015-04-20 17:27 Charles Chen 阅读(728) 评论(0) 推荐(0) 编辑

2012年8月29日

摘要: 托管代码如何调用非托管代码 两种常用的做法: 下载: http://download.microsoft.com/download/f/2/7/f279e71e-efb0-4155-873d-5554a0608523/CLRInsideOut2007_01.exe 1. COM interop 具体操作: a. 用atl写com服务程序 b. 使用Tlbimp将atl写的com程序转换成 COM DLL 用如下命令: tlbimp 你写的com.dll tlbimp是 .NET Framework SDK中附带的类型库导入程序。用这个命令即是把生成一个非托管com dll的托管包装。 c. 托管客户端非常简单 直接new一下,然后调用对应的方法即可。 2. P/Invoke a. 在托管客户端增加一条 DllImport语句和一个方法的调用。 介绍一个P/Invoke网站,http://pinvoke.net/ 阅读全文

posted @ 2012-08-29 15:32 Charles Chen 阅读(6609) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示