最新发布

Xamarin
生活
财经
Csharp
UWP
Unity3D
ASP.NET
Win10
js
.Net
webService
程序员
ArrayOfXElement
代码
Three.js
wpf
教程
标签墙
数码
马自达
汽车
sql
课程表UWP
宏观经济
css样式表
ajax
昂克赛拉
webgl
分页
学习
微软
html
磁贴
中国
ACCESS数据库
错误
游戏
智能推荐
美国
日本
win Form
内容提取
摇滚英雄
DataPager
开心打地鼠
伪静态
SEO
嵌入
VS2016
武侠
必应
股票
跨平台
环境
行业假
幸福
敏捷测试
名词解释
V模型
布局
委托
Task
动态
跑跑卡丁车
鲁迅
名言
验证码
滑块
TDD模式
艺术
style
xml
反序列化
缺点
正则表达式
slider控件
琉璃棕
颜色
数据绑定
ListView
持续集成
阿里妈妈
网站
广告
绝命毒师第四季
  • 软件开发测试模式,V模型,敏捷测试,持续集成。

    作者:songshizhao   时间:2017/10/2 0:13:48
  • C#使用sql语句进行分词模糊搜索

    作者:songshizhao   时间:2017/10/1 17:40:10
  • Ajax()方法请求后台数据

    作者:songshizhao   时间:2017/10/1 17:27:01
  • js页面跳转方法

    作者:songshizhao   时间:2017/10/1 17:04:12
  • 动态加载js脚本的四种方法

    作者:songshizhao   时间:2017/9/24 19:29:19
  • Js使用滑块验证码验证网页并提交

    作者:songshizhao   时间:2017/9/24 1:22:55
  • ASP.NET使用后台更改前台Style

    作者:songshizhao   时间:2017/9/23 16:46:35
  • kindeditor使用syntaxhighlighter高亮代码

    作者:songshizhao   时间:2017/9/21 3:33:57
  • C#求解三对角矩阵数值解法-追赶法

    作者:songshizhao   时间:2017/9/11 1:06:57
  • 引用UEWASP.DLL的C#代码

    作者:songshizhao   时间:2017/9/11 1:00:55
  • 电视剧下载_百度网盘下载_

    作者:songshizhao   时间:2017/9/11 0:47:01
  • uwp取消GridView选中、鼠标悬停效果

    作者:songshizhao   时间:2017/7/27 23:10:40
  • 在win10通用程序开发中使用新的MIDI的API

    作者:songshizhao   时间:2017/7/23 3:09:10
  • Xamarin学习系列(017)-使用MIDI子系统

    作者:songshizhao   时间:2017/7/23 2:58:56
  • 名人名言-鲁迅经典语句摘录

    作者:songshizhao   时间:2017/7/22 20:04:47
  • 写给开发者的几条忠告,自我总结

    作者:songshizhao   时间:2017/7/19 22:54:15
  • 跑跑卡丁车-城镇高速公路-1.52'比赛视频,个人游戏记录

    作者:songshizhao   时间:2017/7/19 22:31:37
  • Xamarin学习系列(016)-改变NavigationPage的Title的字体颜色

    作者:songshizhao   时间:2017/6/30 9:02:38
  • Xamarin学习系列(015)-改变ListView的Item被选中后的颜色

    作者:songshizhao   时间:2017/6/26 23:52:45
  • Xamarin学习系列(014)-XamlTask、DebugType参数错误

    作者:songshizhao   时间:2017/6/21 21:30:01
  • 1 2 3 4 5  ... 

    精彩推荐

    微软抛弃微软.Net了吗?Net技术的未来在哪里,浅谈微软技术路线

    文章贴图
    <p style="text-align:left;text-indent:2em;"> <span style="font-family:&quot;"><strong>Winform</strong>:优点是简单易学,缺点是界面做不好看,适应能力很差。</span> </p> <p style="text-indent:2em;"> <span style="font-family:Microsoft YaHei;"><strong>Wpf</strong>:微软结合了显卡渲染技术推出的界面设计方式,模仿html推出了自己的xaml,winform能实现的wpf都能实现,因为wpf有一个WindowsFormsHost控件,他是为托管winform控件做准备的,比如wpf没有chart控件,可以直接托管一个winform下面chart。比如:</span> </p> <p style="text-indent:2em;"> <span style="font-family:Microsoft YaHei;">需要引用System.Windows.Forms.DataVisualization</span> </p> <pre class="prettyprint lang-xml">&lt;Windowx:Class="WpfApplication1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:FormChar="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" xmlns:Char="clr-namespace:System.Windows.Forms.DataVisualization.Charting;assembly=System.Windows.Forms.DataVisualization" xmlns:WinFormHost="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" xmlns:WinFormControls="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" xmlns:local="clr-namespace:WpfApplication1"mc:Ignorable="d"Title="MainWindow"Height="350"Width="525"&gt; &lt;GridName="AAA"&gt;&lt;WindowsFormsHostx:Name="myFormsChart"FontSize="8"&gt; &lt;Char:Chartx:Name="chart1"&gt; &lt;/Char:Chart&gt; &lt;/WindowsFormsHost&gt; &lt;/Grid&gt; &lt;/Window&gt;</pre> <p> <br /> </p> <p style="text-indent:2em;"> <span style="font-family:Microsoft YaHei;">wpf可以做出自适应布局,做出更炫的动画,所以wpf是很值得学习的,完全可以替代winform,实际上我已经很久不碰winform了。winform和wpf之间转换是相当容易的,因为.net框架是一样的,变化不大,唯一阻碍就是xaml,但wpf同样可以拖控件,还能说什么呢。</span> </p> <p style="text-indent:2em;"> <span style="font-family:Microsoft YaHei;"><strong>Uwp</strong>:uwp是wpf的进化也是wpf的退化,为什么这么说?先说说uwp的优点吧,uwp的优点就是跨平台(这里所谓的平台仅仅是微软自己的平台,wp和pc for win),这可以说是进化,退化就是很多wpf的功能被uwp扔掉了,而且编译出的程序只能在windows应用商店发布,也就是说uwp非常封闭。wpf使用的是传统的.net框架,做出来的是exe程序,uwp使用的是新的.net core框架,做出来的是appx,这个appx只能运行在win10手机和pc系统中。</span> </p> <p style="text-indent:2em;"> <span style="font-family:Microsoft YaHei;"><img src="http://www.songshizhao.com/editor/attached/image/20170221/QQ%E6%88%AA%E5%9B%BE20170221235325.jpg20170221235401_8203.jpg" alt="" width="350" height="246" title="" align="" /><br /> </span> </p> <p style="text-indent:2em;"> <span style="font-family:Microsoft YaHei;">熟悉.net的都知道messagebox和openfiledialog,新的.net core框架在uwp使用openfilepicker和contentdialog等替代来实现同样的功能。微软为什么要这么做?!因为为了适配移动端,.net原来的东西根本就没考虑过要运行在手机上,所以微软进行了重写,所以如果你很熟悉wpf,很熟悉xaml,那么恭喜你你很容易做出uwp的界面,但是也只是仅此而已,因为你熟悉的很多.net框架里面的命名空间和类都被换掉了,还有各种权限问题,屏幕适配问题等等。这些都是转入UWP开发将会遇到的问题。</span> </p> <p style="text-indent:2em;"> <span style="font-family:Microsoft YaHei;">以前做wpf我很喜欢用messagebox来debug,做uwp就老老实实用debug.writeline,这些是天然的鸿沟阻碍你从wpf转向uwp,还有uwp令人诟病的封闭问题,编译出的程序只能提交到应用商店才能发布,想在qq官网下载qq for uwp?抱歉,你需要跳转到微软商店来下载。可能小一点的软件大家觉得也没什么,但是考虑到中国的墙技术,微软商店下载的速度从来就没快过,还经常瘫痪,下一点大的软件那真是因垂死听啊!</span> </p> <p style="text-indent:2em;"> <span style="font-family:Microsoft YaHei;">话题转回来,.net技术过时了吗?从微软的技术路线来看,正在进行.net和.net core框架的合并,从目前的情况来看,.net的功能是强于.net core的,就目前windows桌面程序而言,.net 的能力碾压.net core技术。所以wpf仍然是未来桌面程序开发的主流发展方向(前提是使用.net语言),至于uwp?以我目前的观点,只适合发布一些小型程序。什么时候微软能用uwp发布自己的vs和office套件,并且达到一样的功能的时候再说吧</span> </p> <p style="text-indent:2em;"> <br /> </p> <hr /> <p> <br /> </p> <p style="text-indent:2em;"> <span style="color:#262626;font-family:&quot;">作为一个业余的uwp个人开发者,我发表一下自己对UWP未来发展的观点。</span> </p> <p style="text-indent:2em;"> <span style="color:#337FE5;font-family:&quot;font-size:15px;background-color:#FFFFFF;"><span style="color:#337FE5;font-family:&quot;font-size:15px;background-color:#FFFFFF;"><span style="color:#337FE5;font-family:&quot;"><strong>先说桌面端</strong></span></span></span> </p> <p style="text-indent:2em;"> <span style="color:#262626;font-family:&quot;">uwp唯一的优势可能就是跨平台,功能上并不比wpf强大,因为这是新的.net core开源架构,你没看错,微软已经开源了。不过旧的net framework仍然不开源。开源的这是个什么东西?就是个阉割版的net framework,可以跨平台,但是由于是新的完全比不上net framework几十年的积累(具体多少年不祥,时间应该不短)。总结就是.net core开源框架还是个小娃娃,干不了重活。</span><br /> <span style="color:#262626;font-family:&quot;">&nbsp; &nbsp; &nbsp; <strong><span style="color:#337FE5;">再说移动端</span></strong></span><br /> <span style="color:#262626;font-family:&quot;">微软手机出货量太少,以我一个开发者的角度,微软整个uwp移动端已经初步具有和安卓苹果系统的一拼之力,xamarin是个好东西,c#是个好语言。但这一切并不足以让微软立足移动端,重要还是要看生态。况且市场上wp手机缺乏新机,用户极少,开发者积极性不高。我想微软的田牌wp新机应该已经在路上了,或者已经死在胎里。后者可能性不大。为什么呢?因为如果移动端死了,那新的net core框架除了开源,又有什么意义呢?</span><br /> <span style="color:#262626;font-family:&quot;">&nbsp; &nbsp; &nbsp; &nbsp;<strong><span style="color:#337FE5;">最后说说看法</span></strong></span> </p> <p style="text-indent:2em;"> <span style="background-color:#FFFFFF;"><span style="font-family:Microsoft YaHei;">uwp的优势是跨平台,所以uwp想要发力必须从移动端入手,</span><span style="color:#262626;font-family:&quot;">发展的过程让人越来越沮丧。个人觉得UWP最大的优势大概就是打通移动端和桌面端,然而现在windows phone基本已经死了,风传的surface phone也是遥遥无期、前途未卜,目前看UWP似乎只剩下了PC和二合一这样的平板设备,但在这种生产力环境下已经有了很成熟的exe体系了,各种软件应有尽有,无论从消费者角度还是从开发者角度似乎都找不到很好的理由转向UWP,同样的使用环境(因为wp端基本已死)为何要重复开发,何况目前来看,多数UWP应用还存在大大小小的问题,很难和exe匹敌,</span></span> </p> <p style="text-indent:2em;"> <span style="background-color:#FFFFFF;font-family:&quot;"><span style="color:#262626;font-family:&quot;">至于说分发途径,个人感受来说,目前PC端的软件似乎主要是两个途径推广,一是大厂出手,推广宣传;二是先从移动端入手,获得认同之后再开发桌面端。windows的软件安装容易且开放,软件种类也多,是否像mac一样需要一个统一的分发平台是个问题,从闭环体系开始发展,强制统一分发容易,但已经开放成这样再想从头收束发放问题,无论从消费者还是从开发者方面,阻力都太多,说实话感觉这种行为是在开倒车,如果是从打造跨平台应用立足,是另外一回事,但现在已无移动端,变成了单纯的桌面端问题,性质不同了,预期也不同了,</span></span> </p> <p style="text-indent:2em;"> <span style="font-family:&quot;"><span style="background-color:#FFFFFF;font-family:&quot;">微软的发力方向和真实意图:微软的native编译是真正跨平台的,目前已经实现PCL可移植类库,从早期的MONO的.NET一直发展到现在,微软的意图很明显:云和跨平台!目前.net core架构还是不成熟,但已初具规模,更新速度很快,我们也看到市面上Unity这样的跨平台游戏引擎(第三世代)大规模流行,可能有人觉得unity已经够火了,但我认为目前仅仅是起点而已,未来跨平台工具,像Xamarin等将会越来越完善,目前xamarin(.uwp)不完善的原因还是因为.net core不完善,微软的野心一直很大:一次编译到处运行的不仅仅是云技术。</span></span> </p>

    ASP.NET搭建个人博客整体框架设计

    文章贴图
    <p> 本站是我的独立博客,建站的过程使用asp.net,一般建博客常用wordpress,但我喜欢全部自己弄,这样整个系统更加随心所欲。在开发的过程中遇到过各样的问题都一一解决,这个过程我也学习了不少知识。事实上,我在搭起整个框架之后就迫不及待谢了第一篇博客,就是本篇博客。这篇博客准备连续写下去,把我建站过程中所遇到问题的解决方案分享出来。这篇文章做个引子和目录,主要从下面几个方面入手。 </p> <p> <br /> 一、网站框架设计(大方面) </p> <p> <br /> <span style="font-family:" font-size:18px;"="">1.博客整体框架设计<br /> <span style="font-family:" font-size:18px;"="">2.数据库设计<br /> <span style="font-family:" font-size:18px;"="">3.用户系统<br /> <span style="font-family:" font-size:18px;"="">4.使用富文本编辑器插件(kindEditor)<br /> <span style="font-family:" font-size:18px;"="">5.Asp.net使用伪静态页面</span></span></span></span></span> </p> <p> <br /> 二、网站细节设计 </p> <p> <br /> <span style="font-family:" font-size:18px;"="">1.网站SEO优化<br /> <span style="font-family:" font-size:18px;"="">2.数据库级联删除和级联更新<br /> <span style="font-family:" font-size:18px;"="">3网址地图(为了导航和更好的SEO)<br /> <span style="font-family:" font-size:18px;"="">4.获取html中第一张图片用于列表展示<br /> <span style="font-family:" font-size:18px;"="">5.博客热度统计<br /> <span style="font-family:" font-size:18px;"="">6.评论回复细节设计</span></span></span></span></span></span> </p> <p> <br /> 刚刚做完框架,一个博客系统首先要有一套博客发布、编辑、展示、展示集合系统。就我目前个人的框架来说,具有几个基本页面如图。Bloglist页面是所有博客的展示页面(一般只有标题等关键信息),一般适合作为的主页,但我的博客系统只是我网站系统的一部分,不作为主页使用,当做分页节点使用了。Blogpage页面是用来展示博客内容的页面,你当前在看的页面就是了。Editpage是对当前博客进行修改时进入的页面,submitpage是第一次提交博客的页面。一个博客系统也应该像数据库一样,做到增删改查,有着四个页面基本上都做到了。<br /> <img alt="" src="/editor/attached/image/20170217/QQ截图20170216232914.bmp20170217181750_6171.bmp" /><br /> 博客系统还应该有个用户系统,这个用户系统可以登陆,注册。我自己写博客也是要登陆的,我可以修改或者删除自己写的文章,其他用户则没有权限。同时其他用户可以评论我的博客。下面就是账户系统页面基本架构。<br /> <img alt="" src="/editor/attached/image/20170217/QQ截图20170217002244.bmp20170217181821_4297.bmp" /> </p> <p> <br /> 目前,页面已经很多了,必须要使用母版页了,因为母版页可以做到一次改变,所有子页面跟着改变,比如网站footer更换备案号信息等。母版页还可以为应用程序中的页创建一致的布局。 </p> <p> <br /> 但是母版页有母版页的问题。对于服务器控件,子页面的控件的id会自动改变(增加一串字符),使用js函数getelementbyid的时候要注意。还有就是母版页中相对路径链接问题。母版页的使用相对路径的链接,如果跳转到其他文件夹的页面,相对链接指向就失效了。但是必须使用相对路径!因为使用绝对路径本机调试能过,服务器过不去,服务器过得去,本机过不去。 </p> <p> <br /> 解决办法是使用ResolveUrl函数,比如像下面这样。 </p> <p> <br /> <img width="400" height="242" title="" alt="" src="/editor/asp.net/../attached/image/20170217/QQ截图20170217010204.bmp20170217191624_7578.bmp" /> </p> <p> <br /> <span style="font-family:" color:#ed7d31;font-size:18px;"="">ResolveUr<span style="font-family:" font-size:18px;"="">l<span style="font-family:" font-size:18px;"="">函数可以完美解决这个问题,把相对路径转换成相对根目录的相对路径,因为我的母版页在根目录的文件夹下,所以返回上层一层(../)。</span></span></span> </p> <p> <br /> 写博客还需要富文本编辑器,还需要数据库(不能用纯静态方式存储啊,以后更改页面外观就很难了)。 </p> <p> 框架大概是这样子: </p> <p> <img width="400" height="269" title="" align="" alt="" src="/editor/asp.net/../attached/image/20170309/QQ截图20170309212301.jpg20170309212558_4921.jpg" /> </p>

    ASP.NET使用ajax实现分页局部刷新页面

    文章贴图
    <p> &nbsp;&nbsp;&nbsp; listview列表实现分页是非常容易的。ListView分页是非常简单的,加上一个DataPager控件,把ListView的ID赋予就可以了。最开始我就是这么写的。(网上有人说这样是伪分页?然而并不是!) </p> <p> <br /> </p> <pre class="prettyprint lang-xml"> &lt;asp:ListView ID="newBlogItems" runat="server" DataSourceID="AccessDataSource1" ViewStateMode="Disabled"&gt; &lt;ItemTemplate&gt; &lt;li class="newBlogItem"&gt; ..... &lt;/li&gt; &lt;/ItemTemplate&gt; &lt;/asp:ListView&gt; &lt;asp:DataPager ID="DataPager1" runat="server" PageSize="15" PagedControlID="newBlogItems" ViewStateMode="Disabled"&gt; &lt;Fields&gt; &lt;asp:NextPreviousPagerField ButtonType="Link" ShowFirstPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False" /&gt; &lt;asp:NumericPagerField /&gt; &lt;asp:NextPreviousPagerField ButtonType="Link" ShowLastPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False" /&gt; &lt;/Fields&gt; &lt;/asp:DataPager&gt;</pre> <p> <br /> </p> <p> 然而这样写完,点击分页的效果是刷新整个页面,刷新后页面跳来跳去当然是不友好的,所以要局部更新页面,最开始就想到了jquery插件,于是在网上下载了JPAGES这个插件,摆弄了半天也没弄成,也不知道哪里有错误。。。于是弃坑了,还是ajax吧!。 </p> <p> &nbsp;&nbsp; 使用ajax方法就很简单拉,把大象装冰箱总共分三步。 </p> <p> 1.引入ajax控件ScriptManager,放在form里。 </p> <p> 2.引入ajax控件UpdatePanel。 </p> <p> 3.编辑UpdatePanel内容。 </p> <p> &nbsp;&nbsp; 主要是两个,ContentTemplate和Trigger。先把listView扔ContentTemplate里面。然后在Trigger里面加入asp:AsyncPostBackTrigger,将ID指向之前的分页控件DataPager控件,这样就可以了。代码如下: </p> <p> <br /> </p> <pre class="prettyprint lang-xml">&lt;asp:UpdatePanel runat="server"&gt; &lt;ContentTemplate&gt; &lt;%--数据源--%&gt; &lt;asp:AccessDataSource ID="AccessDataSource1" runat="server" DataFile="C:\storage\users.accdb" SelectCommand="SELECT [userName], [blogTitle], [blogTime], [blogUrl],[statis] FROM [blog] ORDER BY [blogTime] DESC"&gt;&lt;/asp:AccessDataSource&gt; &lt;asp:ListView ID="newBlogItems" runat="server" DataSourceID="AccessDataSource1" ViewStateMode="Disabled"&gt; &lt;ItemTemplate&gt; &lt;li class="newBlogItem"&gt; 此处略去1000字 &lt;/li&gt; &lt;/ItemTemplate&gt; &lt;/asp:ListView&gt; &lt;asp:DataPager ID="DataPager1" runat="server" PageSize="15" PagedControlID="newBlogItems" ViewStateMode="Disabled"&gt; &lt;Fields&gt; &lt;asp:NextPreviousPagerField ButtonType="Link" ShowFirstPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False" /&gt; &lt;asp:NumericPagerField /&gt; &lt;asp:NextPreviousPagerField ButtonType="Link" ShowLastPageButton="True" ShowNextPageButton="False" ShowPreviousPageButton="False" /&gt; &lt;/Fields&gt; &lt;/asp:DataPager&gt; &lt;/ContentTemplate&gt; &lt;Triggers&gt; &lt;asp:AsyncPostBackTrigger ControlID="DataPager1"/&gt; &lt;/Triggers&gt; &lt;/asp:UpdatePanel&gt;</pre> <p> <br /> </p> <p> 后记: </p> <p> ajax的updatepanel服务器控件和url重写(伪静态)的actionlessForm冲突,因为进行了url重写ajax找不到post的地址,在进行url重写的页面加入下面的脚本即可解决问题。 </p> <p> <br /> </p> <pre class="prettyprint lang-js">&lt;script&gt; document.getElementsByTagName("form")[0].action = window.location;//防止ajax和url重写冲突 &lt;/script&gt; </pre> <p> <br /> </p> <pre class="prettyprint lang-html"></pre> <p> 后记2: </p> <p> ajax局部刷新后js不会重新执行,即使将js放进updatePanel服务器控件内部,解决办法,在updatePanel控件建立onLoad事件,在后台加入想要重新执行的js函数,示例如下。 </p> <p> <br /> </p> <pre class="prettyprint lang-cs">protected void Unnamed_Load(object sender, EventArgs e) { //如果有UpdatePanel就用如下代码调用前台js ScriptManager.RegisterStartupScript(UpdatePanel1, this.Page.GetType(), "", "ListViewLoad();", true); }</pre> <p> <br /> </p> <p> (·END·) </p>

    uwp中Slider控件外观style重写

    文章贴图
    <p style="color:#222222;font-family:segoe-ui_normal, &quot;font-size:16px;background-color:#FFFFFF;"> &nbsp; &nbsp; wpf可以对控件外观使用xaml重写模板,默认的外观在<span style="color:#222222;font-family:segoe-ui_normal, &quot;font-size:16px;background-color:#FFFFFF;">(Program Files)\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP;SDK version&gt;\Generic,如果你安装了win10SDK的话,如果没有可以在其他sdk中类似路径寻找。</span> </p> <p style="color:#222222;font-family:segoe-ui_normal, &quot;font-size:16px;background-color:#FFFFFF;"> 对于Slider控件,简单的重写了一下style,瞬间让滑动条变得粗壮了许多,如下图所示: </p> <p style="color:#222222;font-family:segoe-ui_normal, &quot;font-size:16px;background-color:#FFFFFF;"> <img alt="" src="/editor/asp.net/../attached/image/20170408/QQ截图20170408153754.jpg20170408153909_6559.jpg" /> </p> <p style="color:#222222;font-family:segoe-ui_normal, &quot;font-size:16px;background-color:#FFFFFF;"> &nbsp;&nbsp;&nbsp; 根据sdk模板对照修改是一个简单的办法。首先在xaml设计视图里面,右键点击slider控件(其他控件也可以),选择编辑模板,就默认模板会自动填充在代码区,如果vs版本低的话可能需要按照上面的办法手动查看generic.xaml文件。 </p> <p style="color:#222222;font-family:segoe-ui_normal, &quot;font-size:16px;background-color:#FFFFFF;"> &nbsp;&nbsp;&nbsp; 对于slider小小改动一下,就成了上面图片的外观。 </p> <p style="color:#222222;font-family:segoe-ui_normal, &quot;font-size:16px;background-color:#FFFFFF;"> <pre class="prettyprint lang-xml"> &lt;Style TargetType="Slider" x:Key="MySlider"&gt; &lt;Setter Property="Background" Value="White" /&gt; &lt;Setter Property="BorderThickness" Value="1" /&gt; &lt;Setter Property="Foreground" Value="HotPink" /&gt; &lt;Setter Property="FontFamily" Value="youyuan" /&gt; &lt;Setter Property="FontSize" Value="30" /&gt; &lt;Setter Property="ManipulationMode" Value="None" /&gt; &lt;Setter Property="UseSystemFocusVisuals" Value="True" /&gt; &lt;Setter Property="Template"&gt; &lt;Setter.Value&gt; &lt;ControlTemplate TargetType="Slider"&gt; &lt;Grid Margin="10"&gt; &lt;Grid.Resources&gt; &lt;Style TargetType="Thumb" x:Key="SliderThumbStyle"&gt; &lt;Setter Property="BorderThickness" Value="0" /&gt; &lt;Setter Property="Background" Value="Plum" /&gt; &lt;Setter Property="Template"&gt; &lt;Setter.Value&gt; &lt;ControlTemplate TargetType="Thumb"&gt; &lt;Border Background="Black" BorderBrush="Blue" BorderThickness="1" CornerRadius="0" /&gt; &lt;/ControlTemplate&gt; &lt;/Setter.Value&gt; &lt;/Setter&gt; &lt;/Style&gt; &lt;/Grid.Resources&gt; &lt;Grid.RowDefinitions&gt; &lt;RowDefinition Height="Auto" /&gt; &lt;RowDefinition Height="*" /&gt; &lt;/Grid.RowDefinitions&gt; &lt;Grid x:Name="SliderContainer" Background="Transparent" Grid.Row="1" Control.IsTemplateFocusTarget="True"&gt; &lt;Grid x:Name="HorizontalTemplate" MinHeight="44"&gt; &lt;Grid.ColumnDefinitions&gt; &lt;ColumnDefinition Width="Auto" /&gt; &lt;ColumnDefinition Width="Auto" /&gt; &lt;ColumnDefinition Width="*" /&gt; &lt;/Grid.ColumnDefinitions&gt; &lt;Grid.RowDefinitions&gt; &lt;RowDefinition Height="18" /&gt; &lt;RowDefinition Height="Auto" /&gt; &lt;RowDefinition Height="18" /&gt; &lt;/Grid.RowDefinitions&gt; &lt;Rectangle x:Name="HorizontalTrackRect" Fill="{TemplateBinding Background}" Height="12" Grid.Row="1" Grid.ColumnSpan="3" /&gt; &lt;Rectangle x:Name="HorizontalDecreaseRect" Fill="{TemplateBinding Foreground}" Grid.Row="1" /&gt; &lt;TickBar x:Name="TopTickBar" Visibility="Collapsed" Fill="{ThemeResource SystemControlForegroundBaseMediumLowBrush}" Height="{ThemeResource SliderOutsideTickBarThemeHeight}" VerticalAlignment="Bottom" Margin="0,0,0,4" Grid.ColumnSpan="3" /&gt; &lt;TickBar x:Name="HorizontalInlineTickBar" Visibility="Collapsed" Fill="{ThemeResource SystemControlBackgroundAltHighBrush}" Height="{ThemeResource SliderTrackThemeHeight}" Grid.Row="1" Grid.ColumnSpan="3" /&gt; &lt;TickBar x:Name="BottomTickBar" Visibility="Collapsed" Fill="{ThemeResource SystemControlForegroundBaseMediumLowBrush}" Height="{ThemeResource SliderOutsideTickBarThemeHeight}" VerticalAlignment="Top" Margin="0,4,0,0" Grid.Row="2" Grid.ColumnSpan="3" /&gt; &lt;Thumb x:Name="HorizontalThumb" Background="Black" Style="{StaticResource SliderThumbStyle}" DataContext="{TemplateBinding Value}" Height="40" Width="15" Grid.Row="0" Grid.RowSpan="3" Grid.Column="1" AutomationProperties.AccessibilityView="Raw" /&gt; &lt;/Grid&gt; &lt;Grid x:Name="VerticalTemplate" MinWidth="44" Visibility="Collapsed"&gt; &lt;Grid.RowDefinitions&gt; &lt;RowDefinition Height="*" /&gt; &lt;RowDefinition Height="Auto" /&gt; &lt;RowDefinition Height="Auto" /&gt; &lt;/Grid.RowDefinitions&gt; &lt;Grid.ColumnDefinitions&gt; &lt;ColumnDefinition Width="18" /&gt; &lt;ColumnDefinition Width="Auto" /&gt; &lt;ColumnDefinition Width="18" /&gt; &lt;/Grid.ColumnDefinitions&gt; &lt;Rectangle x:Name="VerticalTrackRect" Fill="{TemplateBinding Background}" Width="{ThemeResource SliderTrackThemeHeight}" Grid.Column="1" Grid.RowSpan="3" /&gt; &lt;Rectangle x:Name="VerticalDecreaseRect" Fill="{TemplateBinding Foreground}" Grid.Column="1" Grid.Row="2" /&gt; &lt;TickBar x:Name="LeftTickBar" Visibility="Collapsed" Fill="{ThemeResource SystemControlForegroundBaseMediumLowBrush}" Width="{ThemeResource SliderOutsideTickBarThemeHeight}" HorizontalAlignment="Right" Margin="0,0,4,0" Grid.RowSpan="3" /&gt; &lt;TickBar x:Name="VerticalInlineTickBar" Visibility="Collapsed" Fill="{ThemeResource SystemControlBackgroundAltHighBrush}" Width="{ThemeResource SliderTrackThemeHeight}" Grid.Column="1" Grid.RowSpan="3" /&gt; &lt;TickBar x:Name="RightTickBar" Visibility="Collapsed" Fill="{ThemeResource SystemControlForegroundBaseMediumLowBrush}" Width="{ThemeResource SliderOutsideTickBarThemeHeight}" HorizontalAlignment="Left" Margin="4,0,0,0" Grid.Column="2" Grid.RowSpan="3" /&gt; &lt;Thumb x:Name="VerticalThumb" Background="{ThemeResource SystemControlForegroundAccentBrush}" Style="{StaticResource SliderThumbStyle}" DataContext="{TemplateBinding Value}" Width="24" Height="8" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" AutomationProperties.AccessibilityView="Raw" /&gt; &lt;/Grid&gt; &lt;/Grid&gt; &lt;/Grid&gt; &lt;/ControlTemplate&gt; &lt;/Setter.Value&gt; &lt;/Setter&gt; &lt;/Style&gt;</pre> </p> <p style="color:#222222;font-family:segoe-ui_normal, &quot;font-size:16px;background-color:#FFFFFF;"> <br /> </p> <p style="color:#222222;font-family:segoe-ui_normal, &quot;font-size:16px;background-color:#FFFFFF;"> 备注:slider的其他引用资源 </p> <table style="width:828.8px;font-size:0.875rem;color:#222222;font-family:segoe-ui_normal, &quot;background-color:#FFFFFF;"> <tbody> <tr> <th style="vertical-align:bottom;text-align:left;font-family:segoe-ui_semibold;font-size:0.875rem;font-weight:400;"> Resource key </th> <th style="vertical-align:bottom;text-align:left;font-family:segoe-ui_semibold;font-size:0.875rem;font-weight:400;"> Description </th> </tr> <tr> <td style="vertical-align:top;"> SliderContainerBackground </td> <td style="vertical-align:top;"> Background color at rest </td> </tr> <tr> <td style="vertical-align:top;"> SliderContainerBackgroundPointerOver </td> <td style="vertical-align:top;"> Background color on hover </td> </tr> <tr> <td style="vertical-align:top;"> SliderContainerBackgroundPressed </td> <td style="vertical-align:top;"> Background color when pressed </td> </tr> <tr> <td style="vertical-align:top;"> SliderContainerBackgroundDisabled </td> <td style="vertical-align:top;"> Background color when disabled </td> </tr> <tr> <td style="vertical-align:top;"> SliderThumbBackground </td> <td style="vertical-align:top;"> Background color of the thumb at rest </td> </tr> <tr> <td style="vertical-align:top;"> SliderThumbBackgroundPointerOver </td> <td style="vertical-align:top;"> Background color of the thumb on hover </td> </tr> <tr> <td style="vertical-align:top;"> SliderThumbBackgroundPressed </td> <td style="vertical-align:top;"> Background color of the thumb when pressed </td> </tr> <tr> <td style="vertical-align:top;"> SliderThumbBackgroundDisabled </td> <td style="vertical-align:top;"> Background color of the thumb when disabled </td> </tr> <tr> <td style="vertical-align:top;"> SliderTrackFill </td> <td style="vertical-align:top;"> Color of unfilled portion of track </td> </tr> <tr> <td style="vertical-align:top;"> SliderTrackFillPointerOver </td> <td style="vertical-align:top;"> Color of unfilled portion of track on hover </td> </tr> <tr> <td style="vertical-align:top;"> SliderTrackFillPressed </td> <td style="vertical-align:top;"> Color of unfilled portion of track when pressed </td> </tr> <tr> <td style="vertical-align:top;"> SliderTrackFillDisabled </td> <td style="vertical-align:top;"> Color of unfilled portion of track when disabled </td> </tr> <tr> <td style="vertical-align:top;"> SliderTrackValueFill </td> <td style="vertical-align:top;"> Color of filled portion of track </td> </tr> <tr> <td style="vertical-align:top;"> SliderTrackValueFillPointerOver </td> <td style="vertical-align:top;"> Color of filled portion of track on hover </td> </tr> <tr> <td style="vertical-align:top;"> SliderTrackValueFillPressed </td> <td style="vertical-align:top;"> Color of filled portion of track when pressed </td> </tr> <tr> <td style="vertical-align:top;"> SliderTrackValueFillDisabled </td> <td style="vertical-align:top;"> Color of filled portion of track when disabled </td> </tr> <tr> <td style="vertical-align:top;"> SliderHeaderForeground </td> <td style="vertical-align:top;"> Foreground color of the label </td> </tr> <tr> <td style="vertical-align:top;"> SliderHeaderForegroundDisabled </td> <td style="vertical-align:top;"> Foreground color of the label when disabled </td> </tr> <tr> <td style="vertical-align:top;"> SliderTickBarFill </td> <td style="vertical-align:top;"> Color of the tick marks </td> </tr> <tr> <td style="vertical-align:top;"> SliderTickBarFillDisabled </td> <td style="vertical-align:top;"> Color of the tick marks when disabled </td> </tr> <tr> <td style="vertical-align:top;"> SliderInlineTickBarFill </td> <td style="vertical-align:top;"> Color of inline tick marks </td> </tr> </tbody> </table> <p> <br /> </p>

    发表评论按钮间隔每6秒再次提交

    文章贴图
    <p> 我的博客下面提供回复功能,发表评论按钮间隔每6秒再次提交一次的好处是防止重复提交。 </p> <p> 如果不处理,通常点一下会回复好几个。解决方法是使用js控制按钮的可用性。 </p> <p> <br /> </p> <p> js代码如下: </p> <p> <img src="/editor/asp.net/../attached/image/20170220/QQ截图20170220204854.bmp20170220205032_4765.bmp" alt="" /> </p> <pre class="prettyprint lang-js"> &lt;script type="text/javascript"&gt; var wait = 6; var btn = document.getElementById("ContentPlaceHolder1_btn_comment"); setInterval("change()", 1000); function begin() { wait = 6; } function change() { var btn = document.getElementById("ContentPlaceHolder1_btn_comment"); if (wait &gt; 0) { btn.value = wait; btn.disabled = true; btn.style.backgroundColor = "gray"; wait--; } else { btn.disabled = false; btn.value ="回复"; wait = 0; btn.style.backgroundColor = "#3366ff"; } } &lt;/script&gt;</pre> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p>

    雾霾掩盖下的中国经济真相

    文章贴图
    <p style="text-indent:2em;"> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">1978年11月,中国经济开始改革开放,之后中国经济持续高速发展达30年之久,让全世界瞩目。这30年中,中国经济增长成为世界第3大经济体。中国现在持有2万多亿美元的外汇储备,并已成为第一大贸易国和外国直接投资目的地。很多发展专家和理论家都在鼓吹“中国发展模式”。</span> </p> <p style="text-indent:2em;"> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;"><span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">然而,中国的经济状况实际到底如何?什么是中国经济的真面目?</span><br /> </span> </p> <p style="text-indent:2em;"> <br /> </p> <div style="text-align:center;"> <img src="http://www.5dtour.com.cn:8080/jsprun_sso/attachments/month_1205/20120511f9e0725e2ffd782fdf7539c8792037e3.jpg.thumb.jpg" alt="" width="450" height="299" title="" align="" /> </div> <p style="text-indent:2em;"> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 美国新桥投资集团董事总经理单伟建早在2003年在“财经”杂志上就发表文章提出,中国经济是一个巨大的悖论。一方面,中国是世界上增长最快的经济体,经常保持两位数的增长;另一方面,如果用银行系统的不良贷款比例来衡量,中国却是最没有效率的经济体。从传统经济学的角度看这是匪夷所思的:世界上增长最快的经济体,同时又是最无效率的。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 单伟建说,“没有效率的经济有可能实现真实的增长有两个必要条件。第一是自然的高储蓄率,第二是人为的资本控制。假设公民因为某种原因停止储蓄,银行没有多余资金对企业投放时,增长就会停止。如果允许储蓄流出国境,去寻找更好的投资机会,增长也会停止。”</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 所以,在某种意义上讲,中国经济像是一个服用了兴奋剂的世界冠军,银行通过浪费居民储蓄来推动经济增长。但这是以长期健康为代价的,是不能持久的。中国这种“粗放型”的发展模式,如此高投资水平、高资源消耗、高浪费、高污染和低效率,使得经济成就的代价越来越高。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 在中国,由于没有完善的社会保障体制,老百姓出于养老、医疗等原因积累了大量预防性储蓄。同时,住房体制改革、教育体制改革也使相当多的大众储蓄资金用于买房、子女教育,导致中国的储蓄率一直在40%以上。而美国、日本和欧盟的私人储蓄率分别为4%、11.5%和 11.1%。国务院发展研究中心副主任李剑阁曾在世界国际商会的发言中称,中国拥有世界最高的国民储蓄率,这是支持中国经济高速增长的重要因素。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 中国经济增长的另一个原因是,中国工人的超低工资。表面上,中国的平均工资也一直在增长,但其实大部份流向了垄断行业和高管人员,直接制造产品的工人工资远远低于其它国家。花旗银行在其《宏观中国》研究报告中指出,若不考虑中国制造业劳动力比美国远为密集的因素,中国的劳动力成本只有美国的5%。两年前,美国苹果公司和英国金融时报先后来中国的“富士康”调查显示,富士康公司打工者每天工作15小时以上,月工资不足50美元,还不到美国同类工人2小时的工资。就是这点儿工资,还经常不能按时拿到。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 著名社会经济学家何清涟女士指出,中国成为世界工厂有两个因素,第一就是依赖于中国的血汗工资制。中国的血汗工厂世界闻名,世界上再也找不到比中国劳工更低廉的劳动力了。比如在中国生产一双鞋的成本,加上运费与各种中间环节费用,只要3到4美元。而西班牙生产一双同样的鞋子就要20美元左右。除了劳工工资低廉以外,另一个原因那就是依靠中国为世界资本家承担环保成本;比如鞋子需要皮革,而皮革是一个高污染产业,在外国工厂要付出大量的排污费与其它治理污染的费用,而现在大量的污染都留在中国了。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 中国是世界第3大经济体,目前占世界GDP的约5%,然而却消耗了全球三分之一的煤炭、钢铁和棉花,以及将近一半的水泥。中国的煤炭消费量比美国、印度和俄国的总和还要多;10多年前,中国还是一个完全的石油出口国,而现在已经变成了世界上第三大石油进口国和第二大石油消费国。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 国家环保总局承认,中国万元GDP能源消耗相当于世界平均水平的3至11倍。30年的经济高速增长在很大程度上是建立在资源榨取性的过度消耗甚至浪费的基础之上,并往往以牺牲环境和牺牲后代的机会获得。对于中国目前所面临的生态环境窘境,环保总局承认:中国45种主要矿产15年后剩下6种,5年以后70%以上的石油依赖进口;无论在全球范围内还是局部范围内,中国都是世界上最大的污染者之一。空气和水的污染物浓度都是世界上最高的,这损害了人身健康、也造成了农业收成的损失。根据中国国家环保总局和世界银行最近的报告,空气和水污染使中国损失了5.8%的GDP。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 世界上污染最重的20个城市中,有16个在中国;有三分之二的中国人呼吸着不达标的空气。尽管到处水源短缺,但中国一半以上的河流污染严重,四分之一因为污染过重而无法用于工业和灌溉。大约4亿中国人民缺乏清洁的饮用水。中国的土地资源同样短缺:58%的土地属于干旱或半干旱地区,只有五分之一的耕地属于优质土地。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 英国权威杂志《经济学人》认为,中国经济投资过度,投资占GDP比率高达40至45%,没有一个经济体可以承受。改革开放30年,经济增长了6倍,而资源的消耗却增长了几十倍。如果算上生态成本,中国经济增长将为负值。所谓的“先进生产力”,正是挥霍本已面临枯竭的生态资源而拼出来的。这样的经济增长既无法持久,也对世界和后代子孙贻祸无穷。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 中国经济带动了整个世界经济的增长,却唯独牺牲了中国人民的福利,不仅是牺牲了这一代人的福利,更掏空了子孙后代的资源和环境基础。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 尽管来中国的外国投资已超过印度的10倍,且中国的国民储蓄率高达GDP的40%,而印度的储蓄率只有24%,但在过去10年中,中国的年经济增长率实际上大约为7%,而印度的年增长率则为6%。这说明,与中国相比,印度的资金利用得更有效率。其实,不光是资金利用效率问题,两国经济发展模式有着显着的差别。中国的经济增长靠的是外资和出口,而印度则靠的是内资和内需。这就决定了两国发展潜力和后劲的不同。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 对印度经济贡献最大的是包括信息产业在内的服务业,占GDP的50%。而中国则主要依靠制造业的出口来支撑经济发展,出口产品主要是缺乏技术含量的低级加工产品,如玩具业、制鞋业与纺织业,凭藉的优势是廉价的中国劳动力。这都是牺牲国人利益换来的,如果中国经济不能实现转型和提高效益,生产越多,中国人就被剥削得越厉害。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 中国因为普通百姓的收入不高,造成长期内需不足,经济不得不高度依赖出口,风险增加。目前中国经济对外贸依存度约为60-70%。这种依存度隐藏着非常大的风险,因为外界因素的问题就可以引起中国经济的震荡。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 而上述这一切恶果的根源,在于权力市场化。权力市场化是改变中国财富分配格局的起始点,也是理解中国30年改革开放的一把钥匙。它贯穿于价格双轨制、股份制改造、房地产开发以及国有企业产权转让等一切经济活动中。权力市场化像一头贪婪而凶猛的野兽,30年间一刻不停的啃噬着中国社会上本已单薄的公义。可以说,改革开放的一开始就失去了正义的基点,而后引发的各种问题再加上它在改革过程中一直牺牲老百姓的利益为其权力集团牟利,使社会公义在中国一步步泯灭殆尽。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 近年来,在中国学界所进行的对灰色收入和居民收入差距拉大之间的关系研究表明,目前中国社会内部的灰色收入,高达5万亿,主要来源于五个渠道:行政审批、金融腐败、公共资金流失、土地收益流失、垄断行业收入。目前在中国社会中真正的富人,靠个人奋斗起家的私人企业家只是很少数;真正的富人,主要是那些手中直接掌握着权力或直接、间接与权力有关的人。这也恰恰是人们对目前中国的收入分配状况强烈不满的主要原因。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 当今中国社会收入分配的关键问题,并不是在“不均”上,而是在“不公”上。中国几乎所有的所谓改革,如教育改革,医疗改革,住房改革等等,其实质就是向社会甩包袱,把改革的负担,改革的代价全都由加在社会的弱势群体身上。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 自由经济鼻祖亚当斯密认为,如果市场竞争不公平,如法律偏袒某些群体,存在不诚实的契约、不公平的银行操作和操控价格的阴谋等,造成垄断,那么“无形之手”是无法起到有效率和公平地分配经济资源的作用的。亚当斯密坚决反对各种垄断和伴随而来的权力滥用,这才是他理想中的自由经济的真义。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 中国经济增长主要来自对外贸易。北京科技大学博士生导师周天勇披露,中国进出口贸易的相当大部份,是控制在海外经商留学的高干子女配偶手中。据有关披露,截至2005年底,仅海外高干子女亲属经营的中国进出口贸易每年就达1000多亿美元,拥有财产6千亿美元以上,海外定居的高干亲属子女已经超过百万,其中高干配偶子女有20万人。随着越来越多的政治精英、经济精英和知识精英及其家属加入外国国籍,中国经济特别是地方经济将会越来越深的陷入外资的掌控之中。“少数人掠夺经济增长的果实,多数人承担社会改革的成本”,是中国跛足和变态经济发展的直接后果;“把财富带走,把GDP留给中国,把污染留给中国”,就是中国主导的资源耗尽型出口型经济的真实写照。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 1997年后,中国通过发行国库券等方法进行扩张性财政支出,大举上马各类“面子工程”。为此,中央政府的财政赤字从1997年的560亿飙升到2009年的7397亿。2010年财政赤字可能将占GDP3.1%,创历史最高水平;且借新债还旧债,导致利息负担“如雪球般越滚越大”。而中国的GDP不断刷新,其中各类“面子工程”的兴建和不断拆毁又重复兴建公共设施又占很大比重。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 但政府财政总收入中的教育、卫生、社保等公共开支的比例却低的可怜,中国仅仅为7.4%,而美国是42%,英国49%,加拿大则高达52%。联合国对世界医疗体系的两项排名,一个是医疗卫生体系的实际效果的排名,总共排名国家是192个国家,中国排在144位。第二个是医疗体系公平性排名,中国作为社会主义国家,排名是188位,是倒数第四名。也就是说,中国的医疗体系是最贫富分化的,连很多非洲国家都不如。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 中国的银行也是危机重重。据世界评级机构标准普尔估算,中国银行的坏帐比例在45%,也就是说老百姓的银行存款有一半都打了水漂。中国大陆的公共债务和银行坏帐的增加已到了无法承受的地步,庞大的不良贷款与政府借款,将拖累大陆金融体系,中国大陆随时可能发生金融灾难。而资本外逃是中国金融业的一大特色;贪官们对于中国了无信心,贪污了钱首先都想要存到国外的银行去。中国的资本外逃率,1993年以前是52.3%,以后逐年增加,近年来某些年份的资本外逃率甚至高于100%。</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 曾经被引以为豪的巨额外汇储备,也最终被证实成了烫手的山芋。因为,外汇储备在被消化的过程中,造成中央银行被迫发行8倍于此的人民币将其买入;而它再通过商业银行系统的层层放大至几倍,资金如潮水般冲入中国经济系统,造成严重通货膨胀。国民生产总值一路窜升,人民币实际购买力严重下跌;而通货膨胀真正冲击的是正在艰难维系生计的低收入阶层。……</span><br /> <br /> <span style="color:#333333;font-family:&quot;font-size:14px;background-color:#FFFFFF;">&nbsp; &nbsp; 有人感叹:我们失去了公平,却没有得到效率;我们失去了理想,却没有得到现实;我们失去了“鱼”,却没有得到“熊掌”。对中国来说,这就是经济发展的真相!</span> </p>

    vs2017打包安卓项目

    文章贴图
    <h1 class="dark-blue" style="font-weight:100;font-family:&quot;color:#2C3E50;font-size:50px;"> <span style="font-size:14px;color:#E56600;">摘要:自2015以后,XAMARIN在vs中打包方式改变了,在右侧资源管理器中,点击需要打包的项目,1右键-2存档-3分发。下面是详细的打包过程(官方资料)</span> </h1> <h1 class="dark-blue" style="font-weight:100;font-family:&quot;color:#2C3E50;font-size:50px;"> 正文: </h1> <h1 class="dark-blue" style="font-weight:100;font-family:&quot;color:#2C3E50;font-size:50px;"> 第 1 部分 - 做好应用程序发布准备 </h1> <div class="doc-content" style="color:#4E5758;font-family:&quot;font-size:16px;"> <p style="font-family:inherit;"> 应用程序经编码和测试后,必须准备一个包进行分发。 准备此包的第一个任务是生成供发布的应用程序,其中主要涉及到设置应用程序的一些属性。 </p> <p style="font-family:inherit;"> 有关较早版本的 Xamarin Android(版本 7.0 之前),请参阅&nbsp;<a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/visual-studio-xa-6.1-and-earlier">含 Xamarin Android 6.1 及更低版本的 Visual Studio&nbsp;</a>。 </p> <p style="font-family:inherit;"> 使用以下步骤生成供发布的应用: </p> <ul style="font-family:inherit;"> <li style="font-family:inherit;"> <strong><a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/#Specify_the_Application_Icon">指定应用程序图标</a></strong>&nbsp;– 每个 Xamarin.Android 应用程序应指定一个应用程序图标。 虽然在技术层面并不需要这么做;但是,某些应用商店(例如 Google Play)对此提出了要求。 </li> <li style="font-family:inherit;"> <strong><a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/#Versioning">应用程序版本控制</a></strong>&nbsp;– 此步骤涉及初始化或更新版本信息。 这对应用程序将来的更新以及确保用户知道安装的应用程序版本非常重要。 </li> <li style="font-family:inherit;"> <strong><a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/#shrink_apk">压缩 APK</a></strong>&nbsp;– 通过托管代码上的 Xamarin.Android 链接器和 Java 字节码上的 ProGuard,可大幅压缩最终 APK。 </li> <li style="font-family:inherit;"> <strong><a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/#protect_app">保护应用程序</a></strong>&nbsp;– 通过禁用调试、模糊处理托管代码、添加防调试和防篡改,并使用本机编译来阻止用户或攻击者对应用程序进行调试、篡改或反向工程。 </li> <li style="font-family:inherit;"> <strong><a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/#Set_Packaging_Properties">设置打包属性</a></strong>&nbsp;– 打包属性控制 Android 应用程序包 (APK) 的创建。 此步骤会优化 APK,保护其资产并根据需要模块化打包。 </li> <li style="font-family:inherit;"> <strong><a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/#Compile">编译</a></strong>– 此步骤编译代码和资产,以确认按发布模式生成。 </li> <li style="font-family:inherit;"> <strong><a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/#archive">存档以供发布</a></strong>&nbsp;– 此步骤生成应用,并将其放置在存档中以供签名和发布。 </li> </ul> <p style="font-family:inherit;"> 下面详细说明了上述各步骤。 </p> <p style="font-family:inherit;"> <br /> </p> <a name="" class="injected"></a> <h1 style="font-weight:100;font-family:inherit;color:#365271;font-size:40px;"> 指定应用程序图标 </h1> <p style="font-family:inherit;"> 强烈建议每个 Xamarin.Android 应用程序都指定一个应用程序图标。 某些应用程序商城将不允许发布没有图标的 Android 应用程序。 </p> <p style="font-family:inherit;"> Application&nbsp;特性的&nbsp;Icon&nbsp;属性用于指定 Xamarin.Android 项目的应用程序图标。 此属性可在文件&nbsp;<strong>Properties\AssemblyInfo.cs</strong>&nbsp;中声明,如以下示例代码段中所示: </p> <pre><span class="syntax-container syntax-theme-base"><span class="csharp">[assembly: <span class="function" style="color:#555753;">Application</span>(<span class="type" style="color:#3364AD;">Icon</span> <span class="operator" style="color:#268BD2;">=</span> <span class="string" style="color:#F57D00;">"@drawable/icon"</span>)]</span></span></pre> <p style="font-family:inherit;"> 在 Visual Studio 2013 及更高版本中,可通过项目“属性”的“Android 清单”部分指定应用程序图标,如以下屏幕截图所示: </p> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/01-application-icon.png" class=" fancybox"><img src="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/01-application-icon-sml.png" alt="设置应用程序图标" /></a> </p> <p style="font-family:inherit;"> 在 Visual Studio 2010 中,通过<strong>应用程序</strong>特性的<strong>图标</strong>属性指定应用程序图标,如上所述。 </p> <a name="" class="injected"></a> <h1 style="font-weight:100;font-family:inherit;color:#365271;font-size:40px;"> 应用程序版本控制 </h1> <p style="font-family:inherit;"> 对于 Android 应用程序维护和分发而言,版本控制很重要。 如果没有版本控制,则很难确定应用程序是否应更新或如何更新。 为了辅助版本控制,Android 可识别两种不同类型的信息: </p> <ul style="font-family:inherit;"> <li style="font-family:inherit;"> <p style="font-family:inherit;"> <strong>版本号</strong>&nbsp;– 表示应用程版本的整数值,供 Android 和应用程序内部使用。 对大多数应用程序而言,此值的初始设置为 1,之后随每个内部版本递增。 此值与版本名称属性(见下文)没有关系或关联。 应用程序和发布服务不应向用户显示此值。 此值在&nbsp;<strong>AndroidManifest.xml</strong>&nbsp;文件中存储为&nbsp;android:versionCode。 </p> </li> <li style="font-family:inherit;"> <p style="font-family:inherit;"> <strong>版本名称</strong>&nbsp;– 仅用于向用户传递应用程序(如安装在特定设备上)的版本相关信息的字符串。 版本名称将向用户显示,或在 Google Play 中显示。 此字符串不供 Android 内部使用。 版本名称可以是任何字符串值,它能帮助用户了解其设备上安装的版本。 此值在&nbsp;<strong>AndroidManifest.xml</strong>&nbsp;文件中存储为&nbsp;android:versionName。 </p> </li> </ul> <p style="font-family:inherit;"> 在 Visual Studio 中,可在项目“属性”的“Android 清单”部分设置这些值,如以下屏幕截图所示: </p> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/02-versioning.png" class=" fancybox"><img src="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/02-versioning-sml.png" alt="设置版本号" /></a> </p> <p style="font-family:inherit;"> <span style="color:#365271;font-family:inherit;font-size:40px;">缩小 APK</span> </p> <p style="font-family:inherit;"> 可通过结合使用 Xamarin.Android 链接器(删除不必要的托管代码)和 Android SDK 中的 ProGuard 工具(删除未使用的 Java 字节码)缩小 Xamarin.Android APK。 生成过程首先使用 Xamarin.Android 链接器以托管代码 (C#) 级别优化应用,然后使用 ProGuard(如已启用)以 Java 字节码级别优化 APK。 </p> <p style="font-family:inherit;"> <span style="color:#365271;font-family:inherit;font-size:26px;">配置链接器</span> </p> <p style="font-family:inherit;"> 发布模式会关闭共享运行时并打开链接,使应用程序只提供运行时需要的 Xamarin.Android 部分。 Xamarin.Android 中的<em>链接器</em>使用静态分析来确定 Xamarin.Android 应用程序所使用或引用的程序集、类型和类型成员。 然后,链接器将放弃所有未使用(或引用)的程序集、类型和成员。 这可显著减小包的大小。 例如,<a href="https://developer.xamarin.com/zh-cn/guides/android/advanced_topics/linking">HelloWorld</a>&nbsp;示例,其 APK 的最终大小减少了 83%: </p> <ul style="font-family:inherit;"> <li style="font-family:inherit;"> 配置:无 – Xamarin.Android 4.2.5 大小 = 17.4 MB。 </li> <li style="font-family:inherit;"> 配置:仅 SDK 程序集 – Xamarin.Android 4.2.5 大小 = 3.0 MB。 </li> </ul> <p style="font-family:inherit;"> 通过项目“属性”的“Android”部分设置链接器选项。 若要访问链接器选项,请单击“链接器”选项卡,如以下屏幕截图所示: </p> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/03-linking.png" class=" fancybox"><img src="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/03-linking-sml.png" alt="链接器选项" /></a> </p> <p style="font-family:inherit;"> “链接”下拉菜单提供以下选项,用于控制链接器: </p> <ul style="font-family:inherit;"> <li style="font-family:inherit;"> <strong>无</strong>&nbsp;– 这将关闭链接器;不会执行任何链接。 </li> <li style="font-family:inherit;"> <strong>仅 SDK 程序集</strong>&nbsp;– 这会仅链接&nbsp;<a href="https://developer.xamarin.com/zh-cn/guides/android/advanced_topics/assemblies">Xamarin.Android</a>&nbsp;所需的程序集。 不会链接其他程序集。 </li> <li style="font-family:inherit;"> <strong>SDK 和用户程序集</strong>&nbsp;– 这会链接应用程序所需的所有程序集,而不是仅链接 Xamarin.Android 所需的程序集。 </li> </ul> <p style="font-family:inherit;"> 链接可能产生一些意外的副作用,因此必须在物理设备上的发布模式下重新测试应用程序。 </p> <p style="font-family:inherit;"> <span style="color:#365271;font-family:inherit;font-size:26px;">ProGuard</span> </p> <p style="font-family:inherit;"> ProGuard 是一种链接和模糊处理 Java 代码的 Android SDK 工具。 ProGuard 通常用于创建小型应用程序,工作原理是减少 APK 中包含的大型库的内存占用。 ProGuard 将删除未使用的 Java 字节码,使生成的应用变得更小。 例如,在小型 Xamarin.Android 应用中使用 ProGuard 通常可减少约 24% 大小– 在具有多个库依赖关系的大型应用中使用 ProGuard 通常可实现更大幅度的大小缩减。 </p> <p style="font-family:inherit;"> ProGuard 不是 Xamarin.Android 链接器的替代工具。 Xamarin.Android 链接器链接托管代码,而 ProGuard 链接 Java 字节码。 生成过程首先在应用中使用 Xamarin.Android 链接器优化托管的 (C#) 代码,然后在 Java 字节码级别使用 ProGuard(若已启用)优化 APK。 </p> <p style="font-family:inherit;"> 选择“启用 ProGuard”<strong>P</strong>时,Xamarin.Android 将在生成的 APK 中运行 ProGuard 工具。 ProGuard 配置文件由 ProGuard 在生成时生成和使用。 Xamarin.Android 还支持自定义 ProguardConfiguration 生成操作。 可以将自定义 ProGuard 配置文件添加到项目中,右键单击并选中该文件作为生成操作,如此示例中所示: </p> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/05-proguard-build-action.png" class=" fancybox"><img src="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/05-proguard-build-action-sml.png" alt="ProGuard 生成操作" /></a> </p> <p style="font-family:inherit;"> 默认情况下,禁用 ProGuard。 仅在项目设置为“发布”模式时才能使用“启用 ProGuard”选项。 除非选中“启用 ProGuard”,否则会忽略所有 ProGuard 生成操作。 Xamarin.Android ProGuard 配置不会模糊处理 APK,且不能启用模糊处理,即使处理自定义配置文件也不例外。 如果想要模糊处理,请参阅<a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release#dotfuscator">使用 Dotfuscator 保护应用程序</a>。 </p> <p style="font-family:inherit;"> 有关 ProGuard 工具用法的详细信息,请参阅&nbsp;<a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/proguard">ProGuard</a>。 </p> <a name="" class="injected"></a> <h1 style="font-weight:100;font-family:inherit;color:#365271;font-size:40px;"> 保护应用程序 </h1> <p style="font-family:inherit;"> <br /> </p> <a name="" class="injected"></a> <h2 style="font-weight:normal;font-family:inherit;color:#365271;font-size:26px;"> 禁用调试 </h2> <p style="font-family:inherit;"> 在 Android 应用程序开发期间,将使用 Java 调试线路协议 (JDWP) 执行调试。 这是一种技术,它允许&nbsp;<strong>adb</strong>&nbsp;等工具出于调试目的与 JVM 通信。 默认对 Xamarin.Android 应用程序的调试版本启用 JDWP。 虽然 JDWP 在开发过程中很重要,但它会对已发布的应用程序造成安全问题。 </p> <blockquote class="warning" style="font-family:inherit;color:darkslategray;font-size:1em;background:rgba(247, 226, 139, 0.247059);"> <span class="trigger" style="font-size:40px;line-height:40px;">⚠️</span> <p style="margin-left:52px;font-family:inherit;"> 始终禁用已发布应用程序中的调试状态,因为如果不禁用此状态,则可能(通过 JDWP)获得 Java 进程的完全访问权限并在应用程序的上下文中执行任意代码。 </p> </blockquote> <p style="font-family:inherit;"> Android 清单包含&nbsp;android:debuggable&nbsp;属性,该属性控制是否可以调试应用程序。 将&nbsp;android:debuggable&nbsp;属性设置为&nbsp;false被视为一种很好的做法。 执行此操作最简单的方法是在&nbsp;<strong>AssemblyInfo.cs</strong>&nbsp;中添加条件编译语句: </p> <pre><span class="syntax-container syntax-theme-base"><span class="csharp">#<span class="keyword" style="color:#009695;">if</span> <span class="type" style="color:#3364AD;">DEBUG</span> </span><span class="csharp">[assembly: <span class="function" style="color:#555753;">Application</span>(<span class="type" style="color:#3364AD;">Debuggable</span><span class="operator" style="color:#268BD2;">=</span><span class="constant" style="color:#F57D00;">true</span>)] </span><span class="csharp">#<span class="keyword" style="color:#009695;">else</span> </span><span class="csharp">[assembly: <span class="function" style="color:#555753;">Application</span>(<span class="type" style="color:#3364AD;">Debuggable</span><span class="operator" style="color:#268BD2;">=</span><span class="constant" style="color:#F57D00;">false</span>)] </span><span class="csharp">#endif</span></span></pre> <p style="font-family:inherit;"> 注意,调试版本会自动设置某些权限以简化调试(如&nbsp;<strong>Internet</strong>&nbsp;和&nbsp;<strong>ReadExternalStorage</strong>)。 但是,发布版本只使用显式配置的权限。 若发现切换到发布版本会导致应用失去可在调试版本中使用的权限,请验证是否已在“所需权限”列表中显式启用了此权限,如<a href="https://developer.xamarin.com/zh-cn/guides/android/application_fundamentals/permissions/">权限</a>中所述。 </p> <p style="font-family:inherit;"> <br /> </p> <h2 style="font-weight:normal;font-family:inherit;color:#365271;font-size:26px;"> 使用 Dotfuscator 保护应用程序 </h2> <p style="font-family:inherit;"> 即使<a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/#Disable_Debugging">已禁用调试</a>,攻击者仍可能重新打包应用程序,从而添加或删除配置选项或权限。 这可使他们对应用程序进行反向工程、调试或篡改。&nbsp;<a href="https://www.preemptive.com/products/dotfuscator/overview">Dotfuscator Community Edition (CE)</a>&nbsp;可用于模糊处理托管代码,并在生成时向 Xamarin.Android 应用插入运行时安全状态检测代码。 </p> <p style="font-family:inherit;"> Dotfuscator CE 随附在 Visual Studio 中,但是仅 Visual Studio 2015 Update 3(及更高版本)具有用于 Xamarin.Android 的正确版本。 若要使用 Dotfuscator,请单击“工具”&gt;“PreEmptive Protection - Dotfuscator”。 </p> <p style="font-family:inherit;"> 若要配置 Dotfuscator CE,请参阅&nbsp;<a href="https://www.preemptive.com/obfuscating-xamarin-with-dotfuscator">Using Dotfuscator Community Edition with Xamarin</a>(结合使用 Dotfuscator Community Edition 和 Xamarin)。 完成配置后,Dotfuscator CE 将自动保护创建的每个生成。 </p> <p style="font-family:inherit;"> <br /> </p> <a name="" class="injected"></a> <h2 style="font-weight:normal;font-family:inherit;color:#365271;font-size:26px;"> 将程序集捆绑到本机代码 </h2> <p style="font-family:inherit;"> 此选项启用时,程序集会捆绑到本机共享库中。 此选项使代码保持安全;它通过在本机二进制文件中嵌入这些托管程序集来保护它们。 </p> <p style="font-family:inherit;"> 此选项需要 Enterprise 许可证,仅当“使用快速部署”禁用时才可用。 “将程序集捆绑到本机代码”在默认情况下处于禁用状态。 </p> <p style="font-family:inherit;"> 请注意,“捆绑到本机代码”选项执行不意味着程序集会编译到本机代码中。 无法使用&nbsp;<a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/#aot"><strong>AOT 编译</strong></a>将程序集编译到本机代码中(当前只是试验性功能,不用于生产用途)。 </p> <p style="font-family:inherit;"> <br /> </p> <h2 style="font-weight:normal;font-family:inherit;color:#365271;font-size:26px;"> AOT 编译 </h2> <blockquote class="info" style="font-family:inherit;color:darkslategray;font-size:1em;background:rgba(52, 152, 219, 0.0980392);"> <p style="font-family:inherit;"> AOT 目前是一项<a href="https://developer.xamarin.com/zh-cn/releases/android/xamarin.android_5/xamarin.android_5.1/#Experimental_Features">试验性功能</a>。 不建议用于生产环境。 AOT 和 LLVM 在 Xamarin.Android 5.1 中可用,但在 Xamarin.Android 的更高版本中不再可用。 有关详细信息,请参阅&nbsp;<a href="https://developer.xamarin.com/zh-cn/releases/android/xamarin.android_6/xamarin.android_6.1/#Known_Issues">Xamarin.Android 6.1 发行说明</a> </p> </blockquote> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/#Set_Packaging_Properties">打包属性</a>页上的<strong>AOT 编译</strong>选项支持预先编译程序集。 启用此选项后,通过在运行时之前预编译程序集可将实时 (JIT) 启动开销降到最低。 生成的本机代码包括在 APK 以及未编译程序集中。 这可缩短应用程序启动时间,但代价是 APK 大小会变得稍大。 </p> <p style="font-family:inherit;"> “AOT 编译”选项要求使用 Enterprise 或更高版本的许可证。 仅在项目配置为发布模式时,才可使用“AOT 编译”,并且该选项默认处于禁用状态。 有关 AOT 编译的详细信息,请参阅&nbsp;<a href="http://www.mono-project.com/docs/advanced/aot/">AOT</a>。 </p> <p style="font-family:inherit;"> <br /> </p> <h3 style="font-weight:normal;font-family:inherit;color:#7F8C8D;font-size:20px;"> LLVM 优化编译器 </h3> <p style="font-family:inherit;"> LLVM 优化编译器会创建更小更快速的编译代码,并将 AOT 编译的程序集转换为本机代码,但生成时间会变缓慢。 默认情况下,LLVM 编译器处于禁用状态。 若要使用 LLVM 编译器,必须首先启用“AOT 编译”选项(在<a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/#Set_Packaging_Properties">打包属性</a>页上)。 </p> <blockquote class="info" style="font-family:inherit;color:darkslategray;font-size:1em;background:rgba(52, 152, 219, 0.0980392);"> <p style="font-family:inherit;"> <strong>LLVM 优化编译器</strong>选项需要业务许可证。 </p> </blockquote> <a name="" class="injected"></a> <h1 style="font-weight:100;font-family:inherit;color:#365271;font-size:40px;"> 设置打包属性 </h1> <p style="font-family:inherit;"> 可在项目“属性”的“Android 选项”部分设置打包属性,如以下屏幕截图所示: </p> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/04-packaging.png" class=" fancybox"><img src="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/04-packaging-sml.png" alt="打包属性" /></a> </p> <p style="font-family:inherit;"> 其中许多属性(例如“使用共享运行时”和“使用快速部署”)专用于调试模式。 但是,在发布模式下配置应用程序时,还需要进行其他设置,这些设置用于确定如何<a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/#shrink_apk">针对大小和执行速度优化应用</a>、如何<a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/#protect_app">防止篡改应用</a>,以及如何打包应用以支持不同的体系结构和大小限制。 </p> <a name="" class="injected"></a> <h2 style="font-weight:normal;font-family:inherit;color:#365271;font-size:26px;"> 指定支持的体系结构 </h2> <p style="font-family:inherit;"> 准备 Xamarin.Android 应用进行发布时,必须指定支持的 CPU 体系结构。 单个 APK 可包含计算机代码,以支持多个不同的体系结构。 请参阅&nbsp;<a href="https://developer.xamarin.com/zh-cn/guides/android/application_fundamentals/cpu_architectures/">CPU 体系结构</a>,深入了解如何支持多个 CPU 体系结构。 </p> <p style="font-family:inherit;"> <span style="color:#365271;font-family:inherit;font-size:26px;">每个选定 ABI 生成一个包 (.APK)</span> </p> <p style="font-family:inherit;"> 启用此选项后,会为每个支持的 ABI(在“高级”选项卡上进行选择,如&nbsp;<a href="https://developer.xamarin.com/zh-cn/guides/android/application_fundamentals/cpu_architectures/">CPU 体系结构</a>中所述)分别创建一个 APK,而不是为所有支持的 ABI 创建单个大型 APK。 仅在项目配置为用于发布模式时,才可使用此选项,并且其默认处于禁用状态。 </p> <h2 style="font-weight:normal;font-family:inherit;color:#365271;font-size:26px;"> Multi-Dex </h2> <p style="font-family:inherit;"> 如果启用“启用 Multi-Dex”选项,Android SDK 工具将用于绕过&nbsp;<strong>.dex</strong>&nbsp;文件格式的 65K 方法限制。 65K 方法限制基于应用<em>引用</em>的 Java 方法数(包括应用依赖的任何库中的方法数)– 不基于<em>源代码中写入</em>的方法数。 如果应用程序只定义了几个方法,却使用了多个方法或大型库,则可能超出 65K 限制。 </p> <p style="font-family:inherit;"> 应用可能未使用每个引用库中的每个方法;因此,ProGuard(见上文)等工具可能会将未使用的方法从代码中删除。 最佳做法是仅在绝对必要时启用“启用 Multi-Dex”,也就是说,即使使用 ProGuard,应用引用的 Java 方法仍然超过 65K。 </p> <p style="font-family:inherit;"> 若要深入了解 Multi-Dex,请参阅<a href="http://developer.android.com/tools/building/multidex.html">配置超出 64K 方法的应用</a>。 </p> <p style="font-family:inherit;"> <br /> </p> <h1 style="font-weight:100;font-family:inherit;color:#365271;font-size:40px;"> Compile </h1> <p style="font-family:inherit;"> 完成上述所有步骤后,应用即可用于编译。 选择“生成”&gt;“重新生成解决方案”以验证其是否在发布模式下成功生成。 请注意,此步骤尚不会产生 APK。 </p> <p style="font-family:inherit;"> 本指南的<a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_2_-_signing_the_android_application_package#signing_legacy">第 2 部分</a>将更详细地介绍如何打包和签名。 </p> <a name="" class="injected"></a> <h1 style="font-weight:100;font-family:inherit;color:#365271;font-size:40px;"> 存档以供发布 </h1> <p style="font-family:inherit;"> 若要开始发布过程,请在<strong>解决方案资源管理器</strong>中右键单击项目,然后选择“存档...”上下文菜单项: </p> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/07-archive-for-publishing.png" class=" fancybox"><img src="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/07-archive-for-publishing-sml.png" alt="存档应用" /></a> </p> <p style="font-family:inherit;"> 选择“存档...”选项将启动<strong>存档管理器</strong>并开始应用程序包的存档过程,如以下屏幕截图所示: </p> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/08-archive-manager.png" class=" fancybox"><img src="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/08-archive-manager-sml.png" alt="" width="450" height="176" title="" align="" /></a> </p> <p style="font-family:inherit;"> 另一种创建存档的方法是:在<strong>解决方案资源管理器</strong>中,右键单击“解决方案”,然后选择“全部存档...”,这会生成解决方案并存档可生成存档的所有 Xamarin 项目: </p> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/09-archive-all.png" class=" fancybox"><img src="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/09-archive-all-sml.png" alt="全部存档" /></a> </p> <p style="font-family:inherit;"> “存档”和“全部存档”均会自动启动<strong>存档管理器</strong>。 若要直接启动<strong>存档管理器</strong>,请单击“工具”&gt;“存档管理器...”菜单项: </p> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/10-launch-archive-manager.png" class=" fancybox"><img src="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/10-launch-archive-manager-sml.png" alt="" width="450" height="140" title="" align="" /></a> </p> <p style="font-family:inherit;"> 右键单击“解决方案”节点并选择“查看存档”可随时查看该解决方案的存档: </p> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/11-view-archives.png" class=" fancybox"><img src="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/11-view-archives-sml.png" alt="查看存档" /></a> </p> <a name="" class="injected"></a> <h2 style="font-weight:normal;font-family:inherit;color:#365271;font-size:26px;"> <a name="the-archive-manager"></a>存档管理器 </h2> <p style="font-family:inherit;"> <strong>存档管理器</strong>由“解决方案列表”窗格、“存档列表”和“详细信息面板”组成: </p> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/12-archive-manager-detail.png" class=" fancybox"><img src="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/12-archive-manager-detail-sml.png" alt="" width="450" height="226" title="" align="" /></a> </p> <p style="font-family:inherit;"> “解决方案列表”将显示所有解决方案,其中至少有一个项目已存档。 “解决方案列表”包括以下各部分: </p> <ul style="font-family:inherit;"> <li style="font-family:inherit;"> <strong>当前解决方案</strong>&nbsp;– 显示当前的解决方案。 请注意,如果当前解决方案不含现有存档,此区域可能为空。 </li> <li style="font-family:inherit;"> <strong>全部存档</strong>&nbsp;– 显示包含存档的所有解决方案。 </li> <li style="font-family:inherit;"> <strong>搜索</strong>文本框(顶部)– 根据文本框中输入的搜索字符串筛选“全部存档”列表中列出的解决方案。 </li> </ul> <p style="font-family:inherit;"> “存档列表”显示有关所选解决方案的所有存档的列表。 “存档列表”包括以下各部分: </p> <ul style="font-family:inherit;"> <li style="font-family:inherit;"> <strong>所选解决方案名称</strong>&nbsp;– 显示“解决方案列表”中所选解决方案的名称。 “存档列表”中显示的所有信息均与此选定的解决方案有关。 </li> <li style="font-family:inherit;"> <strong>平台筛选器</strong>&nbsp;– 此字段可按平台类型(如 iOS 或 Android)筛选存档。 </li> <li style="font-family:inherit;"> <strong>存档项目</strong>&nbsp;– 选定解决方案的存档列表。 此列表中的每个项均包括项目名称、创建日期和平台。 还可以显示其他信息,例如存档或发布项目时的进度。 </li> </ul> <p style="font-family:inherit;"> “详细信息面板”显示有关每个存档的其他信息。 用户还可以从此面板启动分发工作流或打开创建分发的文件夹。 “生成注释”部分可将生成注释包括在存档中。 </p> <a name="" class="injected"></a> <h2 style="font-weight:normal;font-family:inherit;color:#365271;font-size:26px;"> <a name="distribution"></a>分布 </h2> <p style="font-family:inherit;"> 准备好发布存档版应用程序后,请在“存档管理器”中选择该存档,然后单击“分发...”按钮: </p> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/13-distribute.png" class=" fancybox"><img src="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/13-distribute-sml.png" alt="" width="450" height="149" title="" align="" /></a> </p> <p style="font-family:inherit;"> “分发通道”对话框包括以下方面的信息:应用、分发工作流进度指示以及分发渠道选项。 首次运行时,提供两个选项: </p> <p style="font-family:inherit;"> <a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/14-distribution-channel.png" class=" fancybox"><img src="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release/Images/vs/14-distribution-channel-sml.png" alt="" width="450" height="257" title="" align="" /></a> </p> <p style="font-family:inherit;"> 可选择以下分发通道之一: </p> <ul style="font-family:inherit;"> <li style="font-family:inherit;"> <p style="font-family:inherit;"> <strong>Ad-Hoc</strong>&nbsp;– 将已签名的 APK 保存到磁盘,以将其旁加载到 Android 设备。 继续查看<a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_2_-_signing_the_android_application_package">第 2 部分</a>,了解如何创建 Android 签名标识、为 Android 应用程序创建新签名证书,以及将&nbsp;<em>ad hoc</em>&nbsp;版本的应用发布到磁盘。 这是为测试创建 APK 的好方法。 </p> </li> <li style="font-family:inherit;"> <p style="font-family:inherit;"> <strong>Google Play</strong>&nbsp;– 将已签名的 APK 发布到 Google Play。 继续查看<a href="https://developer.xamarin.com/zh-cn/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_3_-_publishing_an_application_on_google_play">第 3 部分</a>,了解如何对 APK 进行签名并将其发布到 Google Play 商店。 </p> </li> </ul> </div>

    桌面WPF程序嵌入Unity3D引擎(standalone)并实现通讯。

    文章贴图
    <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> <strong>写在前面:</strong> </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> <br /> </p> <p> 把Unity3D嵌入winform或者wpf程序,过去大部分使用UnityWebPlayer插件来实现,这个插件其实就是网页上播放unity页游的插件。 </p> <p> 但是使用UnityWebPlayer嵌入桌面开发有各种问题,我认为最大的问题是效率问题(加载缓慢),毕竟是网页的加载方式,而且可以确认未来也不会得到任何优化。 </p> <p> 由于WebGL的高速发展,unity公司认识到了webplayer十分鸡肋,毕竟WebGL不需要任何插件可以直接显示3d内容了,所以Unity3D在5.4.x版本以后明确表示 </p> <p> 不再支持webplayer了,所以桌面上UnityWebPlayer插件能不用也就别用了吧。所以大家不要走弯路!! </p> <p> <br /> </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> <br /> </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> <strong>主要内容:</strong> </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> &nbsp;将Unity嵌入桌面程序最好的方式是嵌入unity生成的exe程序,winform程序和unity之间通过socket进行通讯,我认为这也是效率最高,效果最好和最好实现的方式。在Unity程序脚本中,嵌入socket内容,我推荐做成客户端(client),使用wpf程序做服务器端,这是一个谁是主体的问题。这样wpf可以加载多个unity程序。嵌入后的结果如下图所示(请无视具体内容): </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> <img src="/editor/asp.net/../attached/image/20171001/QQ截图20171001164724_副本.jpg20171001165022_8529.jpg" alt="" width="400" height="289" title="" align="" /> </p> <p> 下面简单写了一个脚本,其中man是游戏中的一个gameobject对象。就是上图中穿蓝衣服的男人。在他身上挂着socket脚本如下: </p> <p> <br /> </p> <pre class="prettyprint lang-cs">using UnityEngine; using System.Collections; using System.Net.Sockets; using System; public class demoshows : MonoBehaviour { public GameObject man; const int portNo = 500; private TcpClient _client; byte[] data; string Error_Message; void Start () { try { this._client = new TcpClient(); this._client.Connect("127.0.0.1", portNo); data = new byte[this._client.ReceiveBufferSize]; //SendMessage(txtNick.Text); SendMessage("Unity Demo Client is Ready!"); this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null); } catch (Exception ex) { } } void Update () { transform.Rotate(new Vector3(0, 1, 0),0.1f); } public void rotation() { transform.Rotate(new Vector3(0, 10, 0)); //targetRotation = Quaternion.Euler(45.0f, 45.0f, 45.0f); //// 直接设置旋转角度 //transform.rotation = targetRotation; ////man.transform.rotation.SetAxisAngle(new Vector3(0, 1, 0), 30);; } public void translateX(float x) { transform.Translate(new Vector3(x,0,0)); } public void translateY(float y) { transform.Translate(new Vector3(0, y, 0)); } public void translateZ(float z) { transform.Translate(new Vector3(0, 0, z)); } void OnGUI() { GUI.Label(new Rect(50, 50, 150,50 ), Error_Message); } public new void SendMessage(string message) { try { NetworkStream ns = this._client.GetStream(); byte[] data = System.Text.Encoding.ASCII.GetBytes(message); ns.Write(data, 0, data.Length); ns.Flush(); } catch (Exception ex) { Error_Message = ex.Message; //MessageBox.Show(ex.ToString()); } } public void ReceiveMessage(IAsyncResult ar) { try { //清空errormessage Error_Message = ""; int bytesRead; bytesRead = this._client.GetStream().EndRead(ar); if (bytesRead &lt; 1) { return; } else { Debug.Log(System.Text.Encoding.ASCII.GetString(data, 0, bytesRead)); string message = System.Text.Encoding.ASCII.GetString(data, 0, bytesRead); switch (message) { case "1": translateX(1); break; case "2": translateX(-1); break; case "3": translateY(1); break; case "4": translateY(-1); break; case "5": translateZ(1); break; case "6": translateZ(-1); break; default: Error_Message = "unknown command"; break; } } this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null); } catch (Exception ex) { Error_Message = ex.Message; } } void OnDestroy() { this._client.Close(); } }</pre> <p> <br /> </p> <p> 脚本很简单,就是通过向unity程序发送消息(1~6)实现模型的平移。服务器端,在wpf程序中简单建立一个socket类,ip和端口要和unity对应,在程序启动时先建立服务器端。 </p> <p> <br /> </p> <pre class="prettyprint lang-cs">using System.Net.Sockets; using System.Net; using System.Threading; using System.Diagnostics; using System.Text; using System; namespace Demo_Song { class TcpServer { //私有成员 private static byte[] result = new byte[1024]; private int myProt = 500; //端口 static Socket serverSocket; static Socket clientSocket; Thread myThread; static Thread receiveThread; //属性 public int port { get; set; } //方法 internal void StartServer() { //服务器IP地址 IPAddress ip = IPAddress.Parse("127.0.0.1"); serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverSocket.Bind(new IPEndPoint(ip, myProt)); //绑定IP地址:端口 serverSocket.Listen(10); //设定最多10个排队连接请求 Debug.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString()); //通过Clientsoket发送数据 myThread = new Thread(ListenClientConnect); myThread.Start(); } internal void QuitServer() { serverSocket.Close(); clientSocket.Close(); myThread.Abort(); receiveThread.Abort(); } internal void SendMessage(string msg) { clientSocket.Send(Encoding.ASCII.GetBytes(msg)); } /// &lt;summary&gt; /// 监听客户端连接 /// &lt;/summary&gt; private static void ListenClientConnect() { while (true) { try { clientSocket = serverSocket.Accept(); clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello")); receiveThread = new Thread(ReceiveMessage); receiveThread.Start(clientSocket); } catch (Exception) { } } } /// &lt;summary&gt; /// 接收消息 /// &lt;/summary&gt; /// &lt;param name="clientSocket"&gt;&lt;/param&gt; private static void ReceiveMessage(object clientSocket) { Socket myClientSocket = (Socket)clientSocket; while (true) { try { //通过clientSocket接收数据 int receiveNumber = myClientSocket.Receive(result); Debug.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber)); } catch (Exception ex) { try { Debug.WriteLine(ex.Message); myClientSocket.Shutdown(SocketShutdown.Both); myClientSocket.Close(); break; } catch (Exception) { } } } } } }</pre> <p> <br /> </p> <p> 使用socket一定要注意使用线程,并且退出时及时结束,我这里实现的也不是很好,谁有更好的方法可以告诉我。 </p> <p> 下面大概就是server的启动和释放,效果还好,至少不卡死.... </p> <p> <br /> </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> <br /> </p> <pre class="prettyprint lang-cs">TcpServer WpfServer; int size_state = 0; public MainWindow() { InitializeComponent(); this.Closed += MainWindow_Closed; this.Activated += MainWindow_Activated; this.Deactivated += MainWindow_Deactivated; WpfServer = new TcpServer(); WpfServer.StartServer(); } void MainWindow_Closed(object sender, EventArgs e) { unityhost.Form1_FormClosed(); WpfServer.QuitServer(); }</pre> <p> <br /> </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> <br /> </p> <p> 关于socket通讯的问题大概就这样,大家估计更关系如何嵌入的问题 </p> <p> <br /> </p> <p> <strong>如何嵌入?</strong> </p> <p> <br /> </p> <p> 首先在wpf程序中建立一个winform的自定义控件(不是wpf控件)usercontrol </p> <p> 在usercontrol内新建一个panel(或者其他带有句柄的控件),并设置dock属性为fill。 </p> <p> 启动unity.exe,通过几个api将unity窗口附加在panel句柄上。 </p> <p> (说明:借鉴别人的程序) </p> <p> 需要把unity程序命名为child.exe,放在下面指定位置(Debug\UnityApp\Child.exe,或者release) </p> <p> process.StartInfo.FileName =Application.StartupPath +@"\UnityApp\Child.exe"; </p> <p> <strong>详细代码如下:</strong> </p> <p> <br /> </p> <div class="cnblogs_code" style="background-color:#F5F5F5;font-family:&quot;border:1px solid #CCCCCC;padding:5px;margin:5px 0px;"> <pre> <pre class="prettyprint lang-cs">using System; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Diagnostics; using System.Threading; namespace Demo_Song { public partial class UnityControl : UserControl { [DllImport("User32.dll")] static extern bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw); internal delegate int WindowEnumProc(IntPtr hwnd, IntPtr lparam); [DllImport("user32.dll")] internal static extern bool EnumChildWindows(IntPtr hwnd, WindowEnumProc func, IntPtr lParam); [DllImport("user32.dll")] static extern int SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); private Process process; private IntPtr unityHWND = IntPtr.Zero; private const int WM_ACTIVATE = 0x0006; private readonly IntPtr WA_ACTIVE = new IntPtr(1); private readonly IntPtr WA_INACTIVE = new IntPtr(0); public UnityControl() { InitializeComponent(); this.Load += UnityControl_Load; panel1.Resize+=panel1_Resize; } private void UnityControl_Load(object sender, EventArgs e) { try { process = new Process(); process.StartInfo.FileName =Application.StartupPath +@"\UnityApp\Child.exe"; process.StartInfo.Arguments = "-parentHWND " + panel1.Handle.ToInt32() + " " + Environment.CommandLine; process.StartInfo.UseShellExecute = true; process.StartInfo.CreateNoWindow = true; process.Start(); process.WaitForInputIdle(); // Doesn't work for some reason ?! //unityHWND = process.MainWindowHandle; EnumChildWindows(panel1.Handle, WindowEnum, IntPtr.Zero); unityHWNDLabel.Text = "Unity HWND: 0x" + unityHWND.ToString("X8"); } catch (Exception ex) { unityHWNDLabel.Text = ex.Message; //MessageBox.Show(ex.Message); } } internal void ActivateUnityWindow() { SendMessage(unityHWND, WM_ACTIVATE, WA_ACTIVE, IntPtr.Zero); } internal void DeactivateUnityWindow() { SendMessage(unityHWND, WM_ACTIVATE, WA_INACTIVE, IntPtr.Zero); } private int WindowEnum(IntPtr hwnd, IntPtr lparam) { unityHWND = hwnd; ActivateUnityWindow(); return 0; } private void panel1_Resize(object sender, EventArgs e) { MoveWindow(unityHWND, 0, 0, panel1.Width, panel1.Height, true); ActivateUnityWindow(); } // Close Unity application internal void Form1_FormClosed() { try { process.CloseMainWindow(); Thread.Sleep(1000); while (process.HasExited == false) process.Kill(); } catch (Exception) { } } internal void Form1_Activated() { ActivateUnityWindow(); } internal void Form1_Deactivate() { DeactivateUnityWindow(); } } }</pre> </pre> </div> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> <br /> </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> <span style="font-size:18px;"><strong>最后附上源码,github重置密码死活连不上,<strong>现在就传压缩包到百度云把,</strong>vs版本较高(2012)以上可以打开,注意,低版本打不开工程。</strong></span> </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> &nbsp; </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> <span style="color:#337FE5;font-size:16px;">链接: http://pan.baidu.com/s/1kUQywOB</span> </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> <span style="color:#337FE5;font-size:16px;">密码: gxsn</span> </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> <br /> </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> &nbsp; </p> <p style="font-family:verdana, Arial, Helvetica, sans-serif;font-size:14px;"> &nbsp; </p>

    使用KMS命令行激活win10系统,超简单

    文章贴图
    <p> <span>以前经常使用KMS激活工具激活win10,但是这样太不安全了,劫持浏览器主页还是好的,修改系统核心文件和木马更是家常便饭。所以推荐大家不要使用不受信任的KMS激活工具来激活系统。</span>使用命令行激活win10系统也是很简单的。 </p> <p> <span>1.win+x打开命令提示符(管理员),输入下面的命令。</span> </p> <p> <span> </span> </p> <p> ———————————————————————————————— </p> <p> slmgr.vbs /upk </p> <p> slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX </p> <p> slmgr /skms kms-win.msdn123.com </p> <p> slmgr /ato </p> <p> <span>————————————————————————————————</span> </p> <span> <p> 第一条命令,slmgr.vbs /upk ,是用于卸载当前电脑的密钥。<br /> 第二条命令,slmgr /ipk ******,其中*****是密钥,一般用上面的密钥即可。<br /> 第三条命令,slmgr /skms 【kms-win.msdn123.com】,是设置kms服务器地址,<span style="color:#337FE5;">一般很多kms地址失效,可以尝试其他地址,如kms.xspace.in,kms.shuax.com、skms.ddns.net 等等。如果上面的代码激活不成功,很可能是kms服务器失效了,更改一下服务器地址即可。这样的服务器很多,下面列出一些。</span> </p> <p> <span style="color:#337FE5;"><span>————————————————————————————————</span><span>————————————————————————————————</span><br /> </span> </p> <p> <span style="color:#337FE5;"> </span> </p> </span> <p> 122.226.152.230 不支持office2013、2016,不支持win8.1、10,计数正确,疑似正版服务器 同网段存在浙江台州天台县教育局网站 &nbsp; </p> <p> 45.78.3.223 vlmcsd模拟器03612-00206-155-789653-03-1032-10240.0000-2062015 364F463A8863D35F &nbsp; </p> <p> 54.223.212.31 vlmcsd模拟器05426-00206-187-556825-03-1078-9200.0000-2012015 364F463A8863D35F &nbsp; </p> <p> xykz.f3322.org vlmcsd模拟器05426-00168-152-564055-03-1049-9200.0000-0912013 364F463A8863D35F &nbsp; </p> <p> kms.chinancce.com vlmcsd模拟器03612-00206-167-660553-03-1097-10240.0000-2162015 364F463A8863D35F &nbsp; </p> <p> kms.lotro.cc vlmcsd模拟器03612-00206-171-303903-03-1087-10240.0000-2602015 364F463A8863D35F &nbsp; </p> <p> www.zgbs.cc vlmcsd模拟器03612-00206-171-303903-03-1087-10240.0000-2602015 364F463A8863D35F &nbsp; </p> <p> franklv.ddns.net vlmcsd模拟器06401-00206-273-766251-03-3079-9600.0000-2162015 364F463A8863D35F &nbsp; </p> <p> cy2617.jios.org vlmcsd模拟器03612-00206-190-248585-03-1071-10240.0000-2582015 364F463A8863D35F &nbsp; </p> <p> sense.f3322.net vlmcsd模拟器03612-00206-167-930856-03-5124-10240.0000-2212015 364F463A8863D35F &nbsp; </p> <p> kms-win.msdn123.com vlmcsd模拟器03612-00206-167-930856-03-5124-10240.0000-2212015 364F463A8863D35F &nbsp; </p> <p> k.zpale.com m.zpale.com mvg.zpale.com 远景网友Pale_Cheung的KMS_2013.rar二次修改 5FD363883A464F36 </p> <p> <span>————————————————————————————————</span><span>————————————————————————————————</span> </p> <p> <br /> </p> <p> 第四条命令,slmgr /ato ,是激活命令,连接到kms服务器进行windows激活。 </p> <p> 问:如何查看何时过期?<br /> 答:只需用:slmgr.vbs -xpr 这条命令 </p> <p> 问:如何查看详细激活信息<br /> 答:只需用:slmgr.vbs -dlv 这条命令 </p> <p> 再说下关于数字权利激活(oem激活),前面写了,这种激活是永久的,而且是绑定主板信息的,也就是说,如果更换了电脑硬盘,内存条,网卡等硬件,只要主板在,全新安装win10后(版本要对应上),联网即可激活。 </p> <p> ··END·· </p> <p> <span></span> </p>

    安装vs2017新版Visual Studio体验,值得下载

    文章贴图
    <p> 宇宙第一IDE发布新版了!新版2017带来的内容不多,但全是猛料。看看下面的革新是否有必要安装一个新版? </p> <p> <span style="color:#E53333;">1.模块化启动和安装</span> </p> <p> Visual Studio 2017将支持开发者仅安装自己需要的组件,默认安装占用更小更快。不仅如此,vs的启动速度一直是被开发者所诟病的地方,vs2017使用了新的启动引擎经实际体验vs2017启动速度确实更快了。(据官方宣传快3倍,实际体验至少2倍),<span style="color:#EE33EE;">真心</span><span style="background-color:#FFFFFF;color:#EE33EE;">觉得使用新版2017,这一项改进就够了</span><span style="background-color:#FFFFFF;">。</span> </p> <p> <span style="color:#E53333;">2.XAMARIN强势来袭</span> </p> <p> 微软花高价收购了跨平台开发工具Xamarin,现在免费使用了(如果下载此项注意必须开启vpn),同时带来的还有安卓模拟器苹果虚拟机等等。 </p> <p> <span style="color:#E53333;">3.全新.NET CORE架构和ASP.NET CORE。</span> </p> <p> 微软未来发展方向就是core架构了. </p> <p> <span style="color:#E53333;">4.易用性更新</span> </p> <p> 针对不同语言都有改良。小改进很多,我最喜欢的是代码对其线(下图中的虚线)和<span>简化</span>代码的三个小点。 </p> <p> <img width="400" height="309" title="" align="" alt="" src="/editor/asp.net/../attached/image/20170329/3.jpg20170329163504_1327.jpg" /> </p> <p> <span style="background-color:#FF9900;font-size:18px;">官方下载地址:</span> </p> <p> <a href="https://www.visualstudio.com/zh-hans/thank-you-downloading-visual-studio/?sku=Community&amp;rel=15" target="_blank"><u><span style="color:#337FE5;">https://www.visualstudio.com/zh-hans/thank-you-downloading-visual-studio/?sku=Community&amp;rel=15</span></u></a> </p> <p> <br /> </p> <p> 先下载vs安装软件,在安装软件里面选择你要下载的组件。我下载的组件如下: </p> <p> <img width="480" height="233" title="" align="" alt="" src="/editor/asp.net/../attached/image/20170329/1.jpg20170329161445_0703.jpg" /> </p> <p> 没选C++,罪过罪过 </p> <p> <img width="480" height="239" title="" align="" alt="" src="/editor/asp.net/../attached/image/20170329/2.jpg20170329161523_7422.jpg" /> </p> <p> 想安装xamarin和azure云相关组件的,还是把VPN打开吧!不然下载不完整安装会出错的,推荐一定要按照需求安装,不要一次全部安装,因为是模块化安装的,什么时候需要什么时候打开这个安装软件安装就好了,没必要浪费那么多C盘空间呢! </p> <p> <br /> </p> <p> 后记:当前部分NuGet工具在vs2017上不能安装,比如 <a href="http://www.songshizhao.com/blog/blogPage/85.html" target="_blank">磁贴自动生成工具</a>,不得不说是一种遗憾!不过2017已经提供了官方的磁贴自动生成,这个工具倒也不是必要的了。 </p>

    使用Three.js网页引擎创建酷炫的3D标签墙

    文章贴图
    <p> &nbsp; &nbsp; 使用Three.js引擎(这是开源的webgl三维引擎,gitgub)进行一个简单应用。做一个酷炫的3d效果的标签墙(<a href="http://songshizhao.com/webgl/webgls.aspx" target="_blank">http://songshizhao.com/webgl/webgls.aspx</a>) </p> <p> 效果如下图所示: </p> <p> <img width="300" height="302" title="" align="" alt="" src="/editor/asp.net/../attached/image/20170312/1112.jpg20170312193124_7890.jpg" /> </p> <p> &nbsp; &nbsp; 让所有的标签组成一个球体,并且运动起来。可以手动拖拽,点击可以跳转等等。做完之后小小的总结一下。最后我会把本文的代码整理为html分享在这篇文章下面。 </p> <p> &nbsp; &nbsp; 首先第一步创建一个载体, </p> <pre class="prettyprint lang-html"> &lt;div id="canvas" style="width: 100%; background: url(images/background/bg1.jpg) no-repeat center; height: 400px;"&gt; &lt;%--列表--%&gt; &lt;/div&gt;</pre> <p> &nbsp; &nbsp; 这个载体的作用就是将三维引擎的内容呈现在其中,关键是自定义一个id名字,我用canvas,其余都正常。然后把你想要做动态展示的标签写出来,放在id=‘canvas’元素里,每个标签都需要有id属性。因为我是动态生成的,就不举例子了。three.js可以查找页面中元素放到三维界面当中,也可以输出元素(js方式)到界面中,为了简单我自己做好标签元素然后进行提取。 </p> <p> &nbsp; &nbsp; 引用Three.js核心代码,Three.js很丰富,根据需要引用。我的引用如下 </p> <pre class="prettyprint lang-html"> &lt;script src="../webgl/three.js-master/build/three.js"&gt;&lt;/script&gt; &lt;script src="../webgl/three.js-master/examples/js/controls/OrbitControls.js"&gt;&lt;/script&gt; &lt;script src="../webgl/three.js-master/examples/js/renderers/CSS3DRenderer.js"&gt;&lt;/script&gt;</pre> <p> &nbsp; &nbsp; 其中three.js是必须引用的,第二个引用是支持旋转缩放,第三个自己看名字就知道。最后根据需要使用Three.js引擎,这个有一套固定的写法。比如初始化,渲染等等。正像其他引擎一样! </p> <pre class="prettyprint lang-js"> &lt;script type="text/javascript"&gt; var camera, renderer, scene; var controls; var objects=new Array(); var thetas = new Array(); var phis = new Array(); var r = 450; int(); animate(); function int() { camera = new THREE.PerspectiveCamera(80, window.innerWidth / window.innerHeight, 0.1, 2000000); camera.position.set(0,0,720); scene = new THREE.Scene(); for (var i = 0; i &lt; elements.length; i++) { var element = elements[i]; var phi = Math.acos(-1 + (2 * i) / elements.length); phis.push(phi); var theta = Math.sqrt(elements.length * Math.PI) * phi; thetas.push(theta); var object = new THREE.CSS3DObject(element); object.position.x = r * Math.cos(theta) * Math.sin(phi); object.position.z = r * Math.sin(theta) * Math.sin(phi); object.position.y = r * Math.cos(phi); scene.add(object); objects.push(object); } renderer = new THREE.CSS3DRenderer; //设置大小 renderer.setSize(400, 400); render(); document.getElementById('canvas').appendChild(renderer.domElement); var controls = new THREE.OrbitControls(camera, renderer.domElement); controls.target.set(0, 0, 0); controls.update(); window.addEventListener('resize', onWindowResize, false); controls.addEventListener('change', render); } function render() { renderer.render(scene, camera); } function animate() { requestAnimationFrame(animate); var phi = Math.acos(-1 + (2 * i) / elements.length); var theta = Math.sqrt(elements.length * Math.PI) * phi; for (var i = 0; i &lt; objects.length; i++) { thetas[i] += 0.001;//phis[i] -= 0.001; objects[i].position.x = r * Math.cos(thetas[i]) * Math.sin(phis[i]); objects[i].position.z = r * Math.sin(thetas[i]) * Math.sin(phis[i]); objects[i].position.y = r * Math.cos(phis[i]); //启用下面的代码,标签朝向不变,但因此不可拖拽。 //var vector = camera.position; //vector.copy(objects[i].position - vector).multiplyScalar(1); //objects[i].lookAt(vector); } render(); } function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(400, 400); render(); } &lt;/script&gt;</pre> <p> &nbsp; &nbsp; 用js写三维引擎的代码,是不是很酷,这样就把3d的标签墙做好了,想要看看效果吗?去我的首页看看吧!我去整理整理,把aspx文件提取一下打包成html发表下吧! </p> <p> &nbsp; &nbsp; 接上文!整理结束,做了简单的demo,欢迎使用!如果你觉得内容不错的话,就请留个言,谢谢! </p> <p> <span style="background-color:#FF9900;">下载地址</span>: </p> <p> 点击————&gt;<a class="ke-insertfile" href="/editor/attached/file/20170312/3d标签.zip20170312203913_2578.zip" target="_blank"><u><span style="color:#337FE5;">3d标签.zip</span></u></a> &lt;———— </p>

    使用js和正则表达式提取html中的纯文本和图片地址

    文章贴图
    <p> &nbsp; &nbsp; 使用正则表达式提取html第一张图片的地址(c#) </p> <pre class="prettyprint lang-cs"> /// &lt;summary&gt; /// 取得HTML中第一张图片的 URL。 /// &lt;/summary&gt; /// &lt;param name="sHtmlText"&gt;HTML代码&lt;/param&gt; /// &lt;returns&gt;图片的URL列表&lt;/returns&gt; public static string GetHtmlImageUrl(string sHtmlText) { // 定义正则表达式用来匹配 img 标签 Regex regImg = new Regex(@"&lt;img\b[^&lt;&gt;]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?&lt;imgUrl&gt;[^\s\t\r\n""'&lt;&gt;]*)[^&lt;&gt;]*?/?[\s\t\r\n]*&gt;", RegexOptions.IgnoreCase); // 搜索匹配的字符串 MatchCollection matches = regImg.Matches(sHtmlText); // 取得匹配项列表 string sUrlList = matches[0].Groups["imgUrl"].Value; return sUrlList; }</pre> <p> &nbsp; &nbsp; &nbsp;使用正则表达式提取html文本中纯文字的内容(js) </p> <pre class="prettyprint lang-js">&lt;script&gt; var htmlstr =document.getElementById(&lt;%# Eval("ID", "{0}") %&gt;).innerText; htmlstr = htmlstr.replace(/&lt;[^&gt;]+&gt;/g, ''); document.getElementById(&lt;%# Eval("ID", "{0}") %&gt;).innerHTML= htmlstr; &lt;/script&gt;</pre> <p> <br /> </p> <p> <br /> </p>