Debian 安装 .NET 的汇总

1.APT 安装

使用 APT 进行安装可通过几个命令来完成。 安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加包存储库。

打开终端并运行以下命令:

Bash复制

wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

安装 SDK

.NET SDK 使你可以通过 .NET 开发应用。 如果安装 .NET SDK,则无需安装相应的运行时。 若要安装 .NET SDK,请运行以下命令:

Bash复制

sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-8.0

2.脚本安装

dotnet-install 脚本用于 SDK 和运行时的自动化和非管理员安装。

Bash复制

wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh
chmod +x ./dotnet-install.sh
./dotnet-install.sh --version latest

有关详细信息,请参阅 dotnet-install 脚本参考

若要在命令行上启用 .NET,请参阅设置系统范围的环境变量

在 shell 配置文件中设置以下两个环境变量:

手动安装 .NET 不会添加系统范围的环境变量,并且通常仅适用于安装 .NET 的会话。 应为操作系统设置两个环境变量:

  • DOTNET_ROOT此变量设置为 .NET 安装到的文件夹,例如 $HOME/.dotnet(对于 Linux 和 macOS )和 PowerShell 中的 $HOME\.dotnet(对于 Windows)。
  • PATH此变量应同时包含 DOTNET_ROOT 文件夹和用户的 .dotnet/tools 文件夹。 通常,在 Linux 和 macOS 上为 $HOME/.dotnet/tools,在 Windows 上为 PowerShell 中的 $HOME\.dotnet\tools

 提示

对于 Linux 和 macOS,请使用 echo 命令在 shell 配置文件中设置变量,例如 .bashrc:

Bash复制

echo 'export DOTNET_ROOT=$HOME/.dotnet' >> ~/.bashrc
echo 'export PATH=$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools' >> ~/.bashrc

问题处理:bash: dotnet: command not found

某些情况下,当使用APT安装完成之后,dotnet --info 显示 命令没有找到!使用ll查看 “/usr/bin/dotnet” 链接 指向 “/usr/share/dotnet/dotnet”,但是/usr/share/dotnet/dotnet中并没有dotnet文件。

ll /usr/bin/dotnet
lrwxrwxrwx 1 root root 24 Dec 28 19:22 /usr/bin/dotnet -> /usr/share/dotnet/dotnet

发现APT安装时缺少文件,产生的文件数量不完整。

处理方法:先使用安装脚本安装到 “.dotnet/”文件夹下,拷贝文件到 /usr/share/dotnet,再 使用 ln 链接到 /usr/share/dotnet/dotnet(已创建链接,可以跳过),然后删除 .dotnet 文件夹。

wget https://dot.net/v1/dotnet-install.sh
chmod +x dotnet-install.sh
./dotnet-install.sh
cp -r -n .dotnet/* /usr/share/dotnet
ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet
rm -rf .dotnet

注意:APT安装 在 “.dotnet”文件夹 ,脚本安装 在 “/usr/share/dotnet”文件夹中。所以不要两种安装方法同时,会创建两个副本,占用1个G的空间。可以使用上面的命令,脚本安装,复制子文件后删除一个副本。


问题处理:找不到\无法安装某些包

如果收到类似于“找不到包 {dotnet-package}”或“无法安装某些包”的错误消息,请运行以下命令

以下命令组中有两个占位符。

  • {dotnet-package}
    此项表示要安装的 .NET 包,如 aspnetcore-runtime-8.0。 它在以下 sudo apt-get install 命令中使用。
  • {os-version}
    这表示你正在使用的发行版。 此项在以下 wget 命令中使用。 发行版是数值,如 Ubuntu 上的 20.04 或 Debian 上的 10

首先,尝试清除包列表:

Bash复制

sudo dpkg --purge packages-microsoft-prod && sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update

然后,再次尝试安装 .NET。 如果这不起作用,可使用以下命令运行手动安装:

Bash复制

sudo apt-get install -y gpg
wget -O - https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o microsoft.asc.gpg
sudo mv microsoft.asc.gpg /etc/apt/trusted.gpg.d/
wget https://packages.microsoft.com/config/debian/{os-version}/prod.list
sudo mv prod.list /etc/apt/sources.list.d/microsoft-prod.list
sudo chown root:root /etc/apt/trusted.gpg.d/microsoft.asc.gpg
sudo chown root:root /etc/apt/sources.list.d/microsoft-prod.list
sudo apt-get update && \
  sudo apt-get install -y {dotnet-package}

手动删除 .NET 运行时和 SDK

如果使用 dotnet-install 脚本或通过提取 tarball 来安装 .NET,则必须使用手动方法删除 .NET。

手动安装 .NET 时,它通常安装到 /usr/share/dotnet//usr/lib/dotnet/ 或 $HOME/.dotnet 目录中。 SDK、运行时和 .NET 主机安装到单独的子目录中。 这些“组件”目录包含每个 .NET 版本的目录。 通过删除版本控制目录,可以从系统中删除该版本的 .NET。 这些目录可能因你的 Linux 分发版而异。

可以使用三个命令来发现 .NET 的安装位置:dotnet --list-sdks(用于 SDK)、dotnet --list-runtimes(用于运行时)和 dotnet --info(用于所有内容)。 这些命令不会列出 .NET 主机。 若要确定安装了哪些主机,请检查 /usr/share/dotnet/host/fxr/ 目录。 以下列表表示特定版本的 .NET 的目录,其中 $version 变量表示 .NET 的版本:

  • SDK/usr/share/dotnet/sdk/$version/
  • 运行时:运行时基于特定的 .NET 产品运行时,例如 Microsoft.AspNetCore.All 或 Microsoft.NETCore.App(特别是 .NET 运行时)。 它们将安装到 /usr/share/dotnet/shared/$product/$version 目录,其中 $product 是产品运行时。 例如,可能会看到以下目录:复制/usr/share/dotnet/shared/Microsoft.NETCore.App/$version/ /usr/share/dotnet/shared/Microsoft.AspNetCore.App/$version/ /usr/share/dotnet/shared/Microsoft.AspNetCore.All/$version/
  • .NET 主机/usr/share/dotnet/host/fxr/$version/

使用 rm -rf 命令删除 .NET 版本。 例如,若要删除 6.0.406 SDK,请运行以下命令:

Bash复制

sudo rm -rf /usr/share/dotnet/sdk/6.0.406

 重要

版本目录可能与要卸载的“版本”不匹配。 与单个 .NET 版本一起安装的各个运行时和 SDK 可能具有不同的版本。 例如,你可能安装了 ASP.NET Core 8 运行时,其中安装了 8.0.2 ASP.NET Core 运行时和 8.0.8. NET 运行时。 二者有不同版本的目录。 有关详细信息,请参阅 .NET 的版本控制方式概述


使用 URL 配置终结点

以下部分介绍如何使用以下方式配置终结点:

  • ASPNETCORE_URLS 环境变量。
  • --urls 命令行参数。
  • urls 主机配置键。
  • UseUrls 扩展方法。
  • WebApplication.Urls 属性。

C#中的’?号’及用法

1. 可空类型修饰符(?):

  引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。
  例如:
    string str=null;是正确的。
    int i=null;编译器将报错。
    为了使值类型也可为空,可空类型出现了,可空类型使用可空类型修饰符?来表示,表现形式为T?。
  例:int?表示是可空的整形,DateTime?表示为可空的时间。
  T?其实是System.Nullable<T>(泛型结构)的缩写形式,也就意味着当你用到T?时编译器在编译时会把T?编译成System.Nullable<T>的形式,
  例如:int?,编译后便是System.Nullable<int>的形式。

2. 三元(运算符)表达式(?:):

语法为:条件表达式?表达式1:表达式2;
该操作首先求出条件表达式的值(bool类型),为true时调用表达式1,为flase时调用表达式2。
其逻辑为:"如果为真执行第一个,否则执行第二个。"

 例:
 test ? expression1 : expression2
 test 任何 Boolean 表达式。
 expression1 test 为 true 时返回的表达式。可能是逗点表达式。
 expression2 test 为 false 时返回的表达式。可能是逗点表达式。

 例如:
 string prm1="4"; string prm2="5";
 string prm3 = prm1==prm2?"yes":"no" // 此时prm3值为"no".

3. 空合并运算符(??):

空合并运算符 (null coalescing operator) ??
  用于定义可空类型和引用类型的默认值。如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数。
  例:a??b 如果 a 为非空,则 a ?? b 的结果为 a;否则结果为 b 。

空合并运算符为右结合运算符,即操作时从右向左进行组合的。
  例:“a??b??c”的形式按“a??(b??c)”计算。

 

C# 中的 Json

一直是做的winform多一些, 可最近做的活儿都是常用JSON。

项目的服务交互是 jquery easyui , Handler.ashx做的, 后台是工具配置的数据.

 

fastJSON -> fastJSON.dll

Json.NET -> Newtonsoft.Json.dll

DataContractJsonSerializer -> System.Runtime.Serialization.Json

速度上对比:
fastJSON  > Json.NET > Windows.Data.Json 
参考:
http://james.newtonking.com/json/help/html/JsonNetVsDotNetSerializers.htm
http://james.newtonking.com/json/help/html/JsonNetVsWindowsDataJson.htm

C#、PHP、Python 运算符的优先级

C#、PHP、Python 运算符的优先级

C#  运算符优先级

优先级
类别
运算符
1
基本
(x) x.y f(x) a[x] x++ x――new typeof sizeof checked unchecked
2
单目
+ - ! ~ ++x ――x (T)x
3
乘法与除法
* / %
4
加法与减法
+ -
5
移位运算
<< >>
6
关系运算
< > < = >=
7
条件等
= = ! =
8
位逻辑与
&
9
位逻辑异或
^
10
位逻辑或
|
11
条件与
&&
12
条件或
13
条件
?:
14
赋值
= *= /= %= += -= <<= >>= &= ^= |=

 

上表源自:  http://baike.baidu.com/view/262524.htm#4

C# 提供大量运算符,这些运算符是指定在表达式中执行哪些操作的符号。             ==, !=, &lt;, &gt;, &lt;=, &gt;=, binary +, binary -, ^, &amp;,’ xml:space=”preserve”>整型运算包括 ==、!=、<、>、<=、>=、binary +、binary -、^、& |~, ++, –, and sizeof() are generally allowed on enumerations.’ xml:space=”preserve”>、~、++、– 和 sizeof(),通常在枚举时允许这些运算。  overloaded by the user, thus changing their meaning when applied to a user-defined type.’ xml:space=”preserve”>此外,很多运算符可被用户重载,由此在应用到用户定义的类型时更改这些运算符的含义。

下表列出了按发型版本不同的 C# 运算符:

 

PHP运算符优先级

 

 
结合方向 运算符 附加信息
非结合 clone new clone 和 new
[ array()
非结合 ++ -- 递增/递减运算符
非结合 ~ - (int) (float) (string) (array) (object) (bool) @ 类型
非结合 instanceof 类型
右结合 ! 逻辑操作符
* / % 算术运算符
+ - . 算术运算符 和 字符串运算符
<< >> 位运算符
非结合 < <= > >= <> 比较运算符
非结合 == != === !== 比较运算符
& 位运算符 和 引用
^ 位运算符
| 位运算符
&& 逻辑运算符
|| 逻辑运算符
? : 三元运算符
= += -= *= /= .= %= &= |= ^= <<= >>= 赋值运算符
and 逻辑运算符
xor 逻辑运算符
or 逻辑运算符
, 多处用到

 

 

Python 运算符优先级

 

这个表给出Python的运算符优先级(从低到高).

从最低的优先级(最松散地结合)到最高的优先级(最紧密地结合)。

这意味着在一个表达式中,Python会首先计算表中较下面的运算符,然后在计算列在表上部的运算符。

 
运算符 描述
lambda Lambda表达式
or 布尔“或”
and 布尔“与”
not x 布尔“非”
in,not in 成员测试
is,is not 同一性测试
<,<=,>,>=,!=,== 比较
| 按位或
^ 按位异或
& 按位与
<<,>> 移位
+,- 加法与减法
*,/,% 乘法、除法与取余
+x,-x 正负号
~x 按位翻转
** 指数
x.attribute 属性参考
x[index] 下标
x[index:index] 寻址段
f(arguments...) 函数调用
(experession,...) 绑定或元组显示
[expression,...] 列表显示
{key:datum,...} 字典显示
'expression,...' 字符串转换

 

上两表源自:  http://tool.oschina.net/commons?type=6#php_

 

C#中用正则表达式取页面下拉菜单(select)中的值

 

给几个在C#中,使用正则表达式取页面下拉菜单(select)中的值示例:

//取html中全部 select 的 name
Regex reg_name = new Regex(@"(?<=<select name=\"").*?(?=\"")");

//取html中全部<select>项的值
Regex reg_select = new Regex("(?is)<select name=*.*?>]*.*?</select>");

//取html中一个 select name 等于"Status"的值
Regex status = new Regex(@"(?is)<select name=\""status\"">]*.*?</select>");

 

一下是一段完整的代码和方法,取html中一个下拉菜单 select name 等于”Status”的中值,添加到DropDownList中:

        string strDoc = (你的html);

        //取html中一个下拉菜单 select name 等于"Status"的中值
        Regex status = new Regex(@"(?is)<select name=\""status\"">]*.*?</select>");
        MatchCollection mc_status = status.Matches(strDoc);
        getSelectOptions(mc_status, cmbStatus);

        /// <summary>
        /// 取select对列表复制
        /// </summary>
        /// <param name="selected"></param>
        /// <param name="cmb"></param>
        void getSelectOptions(MatchCollection selected, ComboBox cmb)
        {
            if (selected.Count < 1)
                return;
            txtValues.Text = "";
            txtValues.Text = selected[0].Value.Replace("</option>", Environment.NewLine);
            string tmpTxt = "";
            foreach (string s in txtValues.Lines)
            {
                if (s == "")
                    continue;
                string a = "";
                a = s.Replace("\"", "").Replace("<option value=\"", "");
                int x = a.LastIndexOf(">");
                tmpTxt += a.Substring(x + 1) + Environment.NewLine;
            }
            txtValues.Text = tmpTxt.Trim();
            cmb.Items.Clear();
            cmb.Items.AddRange(txtValues.Lines);
            cmb.SelectedIndex = 0;
            cmb.Size = cmb.PreferredSize;
        }

 

推荐一个正则表达式测试/验证工具 – http://bohu.net/blog/8814

 

解决 webBrowser DocumentCompleted 的多次调用

winform中使用webBrowser抽取页面中的一些数据。断点“webBrowser1_DocumentCompleted”发现,跑进来了好多次。

DocumentCompleted执行多次,跟踪发现ReadyState状态不一样,分别是Intercative和Complete。

而MSDN对这两种状态值的解释是:

  • Complete该控件已完成新文档及其所有内容的加载;
  • Interactive该控件已经加载足够的文档以允许有限的用户交互,比如单击已显示的超链接。

增加判断“ReadyState”之后继续,DocumentCompleted仍然执行了两次,但ReadyState状态一样都是Complete。再查原因。

MSDN对其解释是在多个的帧的情况下DocumentComplete获取触发多次。并非每个框架将触发此事件,但触发DownloadBegin事件的每个框架将触发相应的DocumentComplete事件。

 

最后webBrowser1_DocumentCompleted中的代码是:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            string BrowserUrl = webBrowser1.Url.ToString();

            if (String.IsNullOrEmpty(BrowserUrl)) //检查未赋值或空值
                return;
            if (BrowserUrl.Equals("about:blank")) //是否为空白页
                return;
            if (webBrowser1.ReadyState != WebBrowserReadyState.Complete)  //状态为完成
                return;
            if (e.Url.ToString() != BrowserUrl)  //检查事件url和webBrowser的url
                return;
            if (webBrowser1.DocumentText == "")
                return;

            ... ...
        }

 

还有一点,就是窗体打开就加载webBrowser1,如放在 Form_Load 会使程序界面加载很慢,建议放在 Form_Shown中(每当窗体第一次显示时发生)。

 

使用 .NET Framework 的跨平台开发

(相关参阅)可移植类库 –  http://msdn.microsoft.com/zh-cn/library/gg597391(v=vs.100).aspx

.NET Framework 4.5         

Visual Studio 2012 中的 可移植类库 项目支持 .NET Framework 应用的跨平台开发。

使用此项目编写和生成的可移植程序集,无须在多个平台的修改即可运行,例如 Windows 7,Windows 8,Silverlight ,Windows Phone 和 Xbox 360。             例如,可以创建在桌面应用程序、Windows 应用商店应用程序和移动应用程序中包含共享业务逻辑的类,然后从不同类型的应用程序中引用这些类。

可移植类库项目支持 .NET Framework、Silverlight、适用于 Windows 应用商店应用的 .NET、Windows Phone 和 Xbox 360 中的部分程序集,并提供可用于生成不在这些平台上进行修改也可运行的程序集的 Visual Studio 模板。             如果没有使用可移植类库项目,您必须先指定单个应用程序类型,然后手动修改其他应用程序类型的类库。  可移植类库 项目,可以通过生成在不同设备上的应用程序之间共享的可移植程序集来减少开发和测试代码的时间和费用。

                 说明
如果您使用的是 Visual Studio 2013,则可用的选项和菜单可能与本文中的描述有所不同。

以下各节对 可移植类库 的功能进行了介绍:

  • 先决条件
  • 目标平台
  • 支持的功能
  • 受支持的类型和成员
  • 平台抽象
  • 支持模型-视图-视图模型 (MVVM) 模式
  • 创建可移植类库项目。
  • 选择目标平台
  • 使用可移植类库
先决条件


如果将 Visual Studio 2012 的多平台版本用作开发环境,则您所需的用于开发可移植类库项目的几乎所有内容均可供您使用。               值得注意的是,可移植类库在某些 Visual Studio 单平台版本中不可用,例如 Visual Studio Express for Windows 8。  Windows Phone SDK 8.0 in addition to the version of Visual Studio 2012 that you already have installed.’>此外,如果要面向 Windows Phone 8 进行开发,除了您已经安装的 Visual Studio 2012 版本,还必须安装 Windows Phone SDK 8.0。Portable Library Tools, and save the download file (PortableLibraryTools.exe) on your computer.’>若要在未安装 Visual Studio 2012 的情况下在生成计算机上安装可移植类库工具,请下载 Portable Library Tools (可移植库工具),并将下载的文件 (PortableLibraryTools.exe) 保存到您的计算机上。               /buildmachine switch on the command line.’>从命令提示符窗口运行安装程序,并包括命令行上的 /buildmachine 开关。
目标平台


当您创建 可移植类库 项目时,可以选择要针对的两个或多个平台。               下表显示可用平台。

平台 版本
.NET Framework .NET Framework 4 和更高版本.NET Framework 4.0.3 和更高版本.NET Framework 4.5
Silverlight Silverlight 4 和更高版本(默认选中)。Silverlight 5
Windows Phone Windows Phone 7 和更高版本(默认选中)Windows Phone 7.5 和更高版本Windows Phone 8

                           重要事项
Windows Phone SDK 8.0 for the Windows Phone 8 option. ‘>如果选择 Windows Phone 8,则必须安装 Windows Phone SDK 8.0。
适用于 Windows 应用商店应用的 .NET (*) 不可用
Xbox 360 不可用

该表标识默认情况下处于选中状态的四个平台或版本。               Project Properties dialog box, as shown in the section Selecting the Platforms to Target.’>如 选择要面向的平台 所示,可以通过使用“项目属性”对话框来更改这些默认平台。

支持的功能


在指定目标平台时,在 可移植类库 项目中,仅在您的项目中自动引用这些平台支持的程序集。               您不必添加或移除程序集。  如果您更改目标平台,则自动更新引用的程序集。如果您只以 .NET Framework 4.5 和 适用于 Windows 应用商店应用的 .NET 为目标,那么您就有权访问比其他平台组合中更大的程序集。               此较大程序集的集合与 适用于 Windows 应用商店应用的 .NET 几乎是相同的,但是不包括 Windows.UI.Xaml 命名空间中的类。  .NET for Windows Store apps – supported APIs in the Windows Dev Center.’>有关详细信息,请参见 Windows 开发人员中心中的 .NET for Windows Store apps – supported APIs(用于 Windows 应用商店应用程序的 .NET–受支持的 API)。下表显示了可用平台和版本上支持的功能。

功能 .NET Framework Windows 应用商店 Silverlight Windows Phone Xbox 360
核心
LINQ
IQueryable 7.5 和更高版本
动态关键字 仅限 4.5
Managed Extensibility Framework (MEF)
网络类库 (NCL)
序列化
Windows Communication Foundation (WCF)
模型视图视图模型 (MVVM) 仅限 4.5
数据批注 仅 4.0.3 和 4.5
XLINQ 仅 4.0.3 和 4.5
System.Numerics
受支持的类型和成员


在 可移植类库 项目中可用的类型和成员受若干兼容性因素约束:

  • 它们必须在所选的目标平台之间共享。
  • 必须行为与平台上的这些行为类似。
  • 它们不得是要弃用的候选项。
  • 它们必须在可移植环境中才有意义,特别是在支持成员时是不可移植时。

例如,可移植类库项目不包含任何 UI 相关类型或成员,原因是不同设备的 UI 的行为不同。               如果您的目标是在 可移植类库 引入之前发布的平台(如 Xbox、.NET Framework 4 和Windows Phone 7),那么您可能会遇到限制。

.NET Framework Class Library.’>可查找 可移植类库 支持的成员,在 .NET Framework Class Library(.NET Framework 类库)的参考主题中查找。               在类的成员表中,受支持的成员旁边会显示以下可移植类库图标。

Chars property in the String class is supported in the Portable Class Library.’>例如,下面的图像显示,在 String 类中的 Chars 属性在 可移植类库 中支持。

Version Information section of a reference topic for a note indicating that a type or member is supported in the Portable Class Library project, as shown below.’>按如下显示,还可以查看参考主题的“版本信息”节,了解指示在可移植类库项目中受支持的类型或成员的注释。

平台抽象


通常,您需要从可移植类中调用不可移植的成员。               无法直接调用不可移植的成员,因为这些成员不适用于 可移植类库 项目。  相反,您可以在 可移植类库 项目中创建一个抽象类并可以从所有可移植代码中使用该类。  在特定于平台的项目中,创建抽象类的子类并实现特定于平台的行为。以下示例显示与本地设置一起使用的可移植类。               在 Windows 应用商店 应用程序和 Silverlight 应用程序中处理本地设置的方式各不相同,因此可移植类不提供任何实现详细信息。

C#
using System;

namespace ExamplePortableLibrary
{
    public abstract class ExampleLocalSettings
    {
        public abstract void SetLocalValue(string name, object value);

        public static ExampleLocalSettings Instance { get; set; }
    }
}

在 可移植类库 项目中,可以按以下方式使用。

C#
ExampleLocalSettings.Instance.SetLocalValue("ExampleSetting", "New value to add");

在您的 Silverlight 项目中,添加引用到可移植的程序集,然后创建实现特定于 Silverlight 环境的本地设置操作的子类。  ExampleLocalSettings class.’>下面的示例演示 ExampleLocalSettings 类的 Silverlight 实现。

C#
using System;
using System.IO.IsolatedStorage;
using ExamplePortableLibrary;

namespace SilverlightApplication1
{
    class SilverlightImplementation : ExampleLocalSettings
    {
        public override void SetLocalValue(string name, object value)
        {
            IsolatedStorageSettings.ApplicationSettings.Add(name, value);
        }
    }
}

在您的 Windows 应用商店 应用程序中,添加引用到可移植的程序集,然后创建实现特定于 Windows 应用商店 应用程序的本地设置操作的子类。  ExampleLocalSettings class for a Windows Store app.’>下面的示例演示 Windows 应用商店 应用程序的 ExampleLocalSettings 类的实现。

C#
using System;
using Windows.Storage;
using ExamplePortableLibrary;

namespace App1
{
    class AppImplementation : ExampleLocalSettings
    {
        public override void SetLocalValue(string name, object value)
        {
            ApplicationData.Current.LocalSettings.Values[name] = value;
        }
    }
}

Instance property.’>在 Silverlight 应用程序和 Windows 应用商店 应用程序两个中,必须初始化子类的特定实现并将其设置为 Instance 属性。  通常,您在该应用程序开始时创建此示例。  以下示例显示如何初始化 Silverlight 实现。

C#
ExampleLocalSettings.Instance = new SilverlightImplementation();

以下示例显示如何为 Windows 应用商店 应用程序初始化实现。

C#
ExampleLocalSettings.Instance = new AppImplementation();
支持模型-视图-视图模型 (MVVM) 模式


如果您的目标是 .NET Framework 4.5、适用于 Windows 应用商店应用的 .NET、Silverlight 和 Windows Phone,则可以在解决方案中实现视图 MVVM 模式。               实现此模式的类包括以下:

  • System.Collections.ObjectModel.ObservableCollection<T>
  • System.Collections.ObjectModel.ReadOnlyObservableCollection<T>
  • System.Collections.Specialized.INotifyCollectionChanged
  • System.Collections.Specialized.NotifyCollectionChangedAction
  • System.Collections.Specialized.NotifyCollectionChangedEventArgs
  • System.Collections.Specialized.NotifyCollectionChangedEventHandler
  • System.ComponentModel.DataErrorsChangedEventArgs
  • System.ComponentModel.INotifyDataErrorInfo
  • System.ComponentModel.INotifyPropertyChanged
  • System.Windows.Input.ICommand

Using Portable Class Library with Model-View-View Model.’>有关如何在 可移植类库 项目中实现 MVVM 模式的更多信息,请参见 将可移植类库与模型-视图-视图模型配合使用。

创建可移植类库项目


Portable Class Library template under Visual C# or Visual Basic.’>若要创建 可移植类库 项目,需要在 Visual Studio 2012 中创建一个新项目,然后在 Visual C# 或 Visual Basic 下选择“可移植类库”模板。
选择目标平台


默认情况下,可移植类库项目面向以下平台:

  • .NET Framework 4.5
  • Silverlight 4 及更新版本
  • Windows Phone 7 及更高版本
  • 适用于 Windows 应用商店应用的 .NET

该项目只引用受这些平台支持的程序集。               Solution Explorer, open the shortcut menu for the Portable Class Library project, and then choose Properties.’>若要更改目标平台,则在“解决方案资源管理器”中,打开 可移植类库 项目的快捷菜单,然后选择“属性”。

Library tab specifies the platforms that are currently targeted.’>在项目属性页上,“库”选项卡指定当前面向的平台。

Change button, and then select the appropriate check boxes.’>若要添加或移除目标平台,请选择“更改” 按钮,然后选择相应的复选框。

更改目标平台时,该项目中可用的程序集会发生更改以匹配您所选平台支持的程序集。               如果您的项目引用的程序集不受某个所选平台支持,必须移除对相应程序集的引用或更改目标平台。

使用可移植类库


在您生成 可移植类库 项目后,只是从其他项目引用该项目。               可以引用该项目或包含您要访问的类的特定程序集。若要运行引用 可移植类库 程序集的应用程序,必须在计算机上安装所需版本(或更高版本)的目标平台。               Visual Studio 2012 包含所有必需的架构,因此您可以运行该应用程序,而无需在用于开发应用程序的计算机上进行进一步修改。

部署 .NET Framework 应用程序

部署引用 可移植类库 程序集的 .NET Framework 应用程序时,必须在正确版本的 .NET Framework 上指定一个依赖项。                 通过指定此依赖项,可确保与您的应用程序一起安装所需的版本。  update, Update 4.0.3 for the .NET Framework 4, or the .NET Framework 4.5 installed.’>如果面向的是 .NET Framework 4 或更高版本,则必须已安装含 update(更新)的 .NET Framework 4、.NET Framework 4 的更新 4.0.3 或 .NET Framework 4.5。

  • Solution Explorer, choose the project node for the project you want to publish. (This is the project that references the Portable Class Library project.) On the menu bar, choose Project, Properties, and then choose the Publish tab.’>若要使用 ClickOnce 部署创建依赖项,请在“解决方案资源管理器”中,选择您要发布的项目对应的项目节点。(这是引用可移植类库项目的项目。)在菜单栏上,依次选择“项目”、“属性”,然后选择“发布”选项卡。                     Publish page, choose Prerequisites.’>在“发布”页上,选择“系统必备”。  选择所需 .NET framework 版本(或 .NET framework 4 更新)作为系统必备组件。
  • Solution Explorer, choose the setup project.’>若要创建安装项目的依赖项,请在“解决方案资源管理器”中,选择此安装项目。                     Project, Properties, Prerequisites.’>在菜单栏上,依次选择“项目”、“属性”、“系统必备组件”。  选择所需 .NET Framework 版本作为系统必备组件。

.NET Framework Deployment Guide for Developers.’>有关部署 .NET Framework 应用程序的更多信息,请参见 .NET Framework 部署指南(针对开发人员)。

部署基于 Silverlight 的应用程序

部署引用 可移植类库 程序集的基于 Silverlight 的应用程序时,您必须确保该应用程序所需的最低运行时版本匹配其目标版本。                 如果面向的是 Silverlight 4,则版本必须是 4.0.60129.0 或更高版本。  &lt;param name=”minRuntimeVersion” value=”4.0.60129.0″ /&gt; in the webpage that hosts the Silverlight-based app, as follows:’>通过在承载基于 Silverlight 的应用程序的网页中包括,可设置 <param name=”minRuntimeVersion” value=”4.0.60129.0″ /> 参数值。

XAML
<div id="silverlightControlHost">
    <object data="data:application/x-silverlight-2," 
           type="application/x-silverlight-2" width="100%" height="100%">
    <param name="source" value="ClientBin/SilverlightApplication.xap"/>
    <param name="onError" value="onSilverlightError" />
    <param name="background" value="white" />
    <param name="minRuntimeVersion" value="4.0.60129.0" />
    <param name="autoUpgrade" value="true" />
    <a href="http://go.microsoft.com/fwlink/?LinkID=149156&v=4.0.50826.0" 
             style="text-decoration:none">
      <img src=http://go.microsoft.com/fwlink/?LinkId=161376
             alt="Get Microsoft Silverlight" style="border-style:none"/>
    </a>
  </object>
   <iframe id="_sl_historyFrame" 
              style="visibility:hidden;height:0px;width:0px;border:0px">
   </iframe>
</div>

可移植类库中的 API 差异

为了使可移植类库程序集在所有支持的平台中兼容,稍微更改了可移植类库中的部分成员。                 API Differences in Portable Class Library.’>有关对哪些成员进行了更改以及进行了怎样的更改的详细信息,请参见可移植类库中的 API 差异。

原文连接: http://msdn.microsoft.com/zh-cn/library/gg597391(v=vs.110).aspx#feedback

国际化域名IDN (Internationalized Domain Names) 转换

将域名国际化 IDN (internationalized domain name) 标准编码的域名标签的子字符串解码为一个 Unicode 字符串(Punycode). 或者将一个国际化域名字符串(Punycode )转换为符合 IDN 标准的域名
例:
Bücher.ch --> xn--bcher-kva.ch |
новини.com --> xn--b1amarcd.com |
统计局.中国 --> xn--dgtp91f7xi.xn--fiqs8s |
xn--j6w193g.xn--fiqs8s --> 香港.中国

代码段:

IDNA  >> Punycode

IdnMapping idn = new IdnMapping();
string international = idn.GetAscii(yourDomain, 0, yourDomain.Length);

Punycode  >> IDNA

>IdnMapping idn = new IdnMapping();
string nonInternational = idn.GetUnicode(yourDomain, 0, yourDomain.Length);

 

下载文件 : IDN Converter

 

在C#中调用 VB.Net 中的 IsSingleInstance 实现只运行单个实例的应用程序

<<Windows Forms 2.0 Programming, 2nd Edition>>   –  Single-Instance Applications 这一章中, 学到了调用 VB.Net 中的 IsSingleInstance, 为 C# WinForm 添加只运行应用程序的单个实例 ( Single Instance Application). 是个好方法!

该方法显然从易用性上便捷与 Mutex 和 Process 这两种只运行单个应用程序实例的方法.

 

Single Instance 概念:

从.NET 2.0起,提供了WindowsFormsApplicationBase类来简化Windows应用程序编程,如果您是开发人员会感到感到奇怪,WindowsFormsApplicationBase类不在System.Windows.Forms 命名空间中而是属于Microsoft.VisualBasic.ApplicationServices 命名空间,也许这是作为VB.NET开发人员的优先好处吧。该类对应的程序集为Microsoft.VisualBasic.dll,不过该程序集包含在.NET框架中一起发布,如果要引用该程序集,在部署上不存在额外操作。

WindowsFormsApplicationBase类实现了类似于Application类的一些功能,不过该类还包含一些简化Windows Forms应用程序开发的接口,下面来简单了解一下。WindowsFormsApplicationBase类实现了对单实例应用程序的支持,通过设置IsSingleInstance 属性为True以及重写OnStartupNextInstance方法可以简洁的实现。

 

实现

在 Program.cs – Main 方法

1. 项目中引用VB.Net 的DLL – Microsoft.VisualBasic.DLL,

Program.cs

using Microsoft.VisualBasic.ApplicationServices;

2. 在Program.cs中增加一个类

Program.cs

public sealed class SingleInstanceApplication : WindowsFormsApplicationBase
{
    public SingleInstanceApplication()
    {
        base.IsSingleInstance = true;
        base.ShutdownStyle = ShutdownMode.AfterMainFormCloses;
    }

    protected override void OnCreateMainForm()
    {
        base.MainForm = new MainForm();
    }

    protected override void OnStartupNextInstance(StartupNextInstanceEventArgs e)
    {
        base.OnStartupNextInstance(e);
        base.MainForm.Activate();
    }
}

 

3. 修改原 Application.Run(new MainForm()); 方法为:

//添加运行单进程程序
SingleInstanceApplication application = new SingleInstanceApplication();
application.Run(args);

 

SingleInstanceApplication类继承自WindowsFormsApplicationBase,在构造函数中设置为单实例模式,同时设置在主窗体关闭后退出应用程序。在继承类中,OnCreateMainForm方法被重写用来创建主窗体,如果要保证应用程序单一实例运行,还需要重写OnStartupNextInstance方法,在该应用程序的下一个应用程序实例启动时,OnStartupNextInstance方法会得到执行,在上面的实现代码中,调用基类方法同时激活主窗口。

 

C# 多线程操作整理 (System.Threading)

Thread 类

创建并控制线程,设置其优先级并获取其状态。

命名空间:System.Threading 程序集:mscorlib(在 mscorlib.dll 中)

概述与概念

C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行。一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多线程创建额外的线程。

1.使用线程的情况

  • ①.程序需要执行和两个和多个任务
  • ②.程序要等待某事件的发生:例如用户输入、文件操作、网络操作和搜索
  • ③.后台程序

2.多线程的并发执行 如果有多个线程在执行,单CPU只有一个,到底执行的哪个?

  • ①.如果一个线程连续占用CPU资源时间过长,其它的资源得不到执行,      则系统会强制的切换执行其它线程。(强制剥夺)
  • ②.如果一个线程没事可做、CPU可执行其它线程。(主动放弃)
  • ③.这是由操作系统的调度机制决定的,不同的操作系统调度机制不一样。    一般无法精确的预料多线程的执行顺序,在程序设计的时候应特别注意

3.创建并启动线程

ThreadStart 线程启动委托名=new ThreadStart(方法名);

Thread 线程实例名=new Thread(线程启动委托名); 线程实例名.Start();

4.终止线程

  • ①.线程实例名.Abort();用此方法的后果是不可恢复的终止线程。
  • ②.线程实例名.Interrupt();中断后可恢复

5.休眠线程

  • ①.线程实例名.Sleep();     当线程Sleep时,系统就立即退出执行队列一段时间,当睡眠结束时,系统会产生一个时钟中断,从而     使线程回到执行队列中,从而恢复线程的执行。

6.挂起/恢复线程

  • ①.线程实例名.Suspend();挂起     与线程休眠不同,线程的挂起不会使线程立即停止执行,直到线程到达安全点之后它才可以将该线程挂起,如果线程尚未启动或已经停止,则它将不能挂起。
  • ②.线程实例名.Resume();恢复      将使一个线程跳出挂起状态并使该线程继续执行。     一个线程不能对另一个线程调用Sleep() ,但是一个线程可以对另一个线程调用Suspend()。     还可以使用许多其它的方式来阻塞线程。例如,可以通过调用 Thread.Join 使一个线程等待另一个线程 (子线程)停止。使用Monitor.Wait使一个线程等待访问一个同步对象。

7.串行化线程

  • ①.线程实例名.jion();     例如在主线程中插入t.jion();      主线程执行到这条语句后,主线程(当前线程)立即进入阻塞状态.直到t运行完后阻塞状态才解除。相当于把t的任务插入或串联到主线程中,把两条线索串联成一条线索

8.线程的锁定机制 线程的锁定机制可以保证每次只有一个线程可以访问共享资源。 使用关键字lock

  • ①.lock语句的语法      lock(对象引用)语句块;
  • ②.lock语句的功能      当对象被lock 锁定时,访问该线程的其它线程会进入等待的状态。
  • ③.对象锁机制保证了对象访问的完整性:只有一个线程完成操作后,其它的线程才能进行操作。
  • ④.一般情况下,当一个线程写某个变量,而同时可能有其它的线程读或写这个变量时,为了保持数据的一 致性应该使用锁定机制。
  • ⑤.线程的安全性      线程安全性就是保护的类的成员和代码的安全,从而使他们不会同时被几个线程中断,使用锁定机制。
  • ⑥.多线程公用一个对象时,就不应该使用lock关键字了,这里Monitor,Monitor提供了使线程共享资源的方 案。 Monitor类可以锁定一个对象,一个线程只有得到这把锁才可以对该对象进行操作。 如: Monitor.Enter(obj);
    Monitor.Exit(obj);
  • ⑦.临界区和锁 当谈论多线程应用程序的时候,首先应该想到的就是并发性问题。尽管这对于同时执行多个任务的程序是很有用的,但通常都是危险的。为了解决这个问题,在C#中提出了临界区和锁的概念。在程序设计中,临界区是一块在任何时候只能有一个进程进入的区域。在C#中通过语句lock来声明临界区。lock声明后面的代码,不管是以行还是一块代码,在同一时间最多只能有一个进程执行。

9.线程的优先级具有不可靠性,就是说不能用优先级来控制线程的执行顺序。

10.后台线程

  • ①.什么是后台线程?比起应用程序的主图形用户界面(GUI)线程来说,这些线程以较低的优先权在不同的过程中运行着。对于不能立即执行结束, 又不想一直等待的任务,后台线程能很好的胜任。在C#中,把线程对象的  IsBackground属性设为true,该线程即为后台线程。    后台线程跟前台线程只有一个区别,那就是后台线程不妨碍程序的终止。一旦一个进程所有的前台线程都终止后,CLR将通过调用任意一个存活中的后台进程的Abort()方法来彻底终止进程。注意:后台线程不能直接操作所在进程之外的数据引用。
  • ②.怎样与后台线程通讯?运用MethodInvoker委派实体。也可在初始化(构造函数)中加入下面一句即可实现通讯:

Control.CheckForIllegalCrossThreadCalls = False;

要使用MethodInvoker委派,需要三个条件:

  •   a.一个创建委派的后台线程
Thread thread=new Thread(new ThreadStart(Run));

thread.IsBackground=true;  //把Thread设为后台线程

thread.Start();
  •   b.一个用作后台线程与前台可视化单元的接口的类级方法
 public void Run()
        {
            int count = 0;
            try
            {
                MethodInvoker mi = new MethodInvoker(this.UpdateLabel);
                //创建一个委托,UpdateLabel是该委托所托管的代码,必须是声明为void 且不接受任何参数的任何方法。
                while (true)
                {
                    count++;
                    //this.Invoke(mi);//同步执行委托
                    this.BeginInvoke(mi);//异步执行委托
                    Thread.Sleep(500);
                }
            }
            catch (ThreadInterruptedException e)
            {
                Console.WriteLine("Interruption Exception in Thread:{0}", e);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception in Thread:{0}", ex);
            }
        }
  •   c.一个应用程序中可以更新的可视化单元
public void UpdateLabel()
{     
    label1.Text=count.ToString();   
}