未能加载文件或程序集“App_Web_xxxx”

 今天在用WCF写服务的时候,服务一直连不上,直接查看svc文件,发现如下错误 未能加载文件或程序集“‘App_Web_****, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",****是一个随机字符串。 解决方法中: 在web.config里配置成这样子: <compilation debug="true" batch="false"> 就好了。中午和下午一直在搞javascript连接WCF的demo,总算是晚上搞定了,,还是老样子,,最大的体会就是很多东西就是看着简单,写起来会有各种各样的问题,比如这次,即使照着微软的官方文档来,也会有错误。动手才是王道,不管做什么。这几天忙完了,写篇文章出来。 最后分享一下微软官方的WCF与Ajax开发实践系列课程,我只能说WCF这东西没有哪一本书比微软官方的技术培训讲的更好了,非常建议学习。 武汉最近下雨了,天气挺凉爽,过几天准备回家吧。。

2012-07-14 · 1 min · bystander

SQLServer启用xp_cmdshell

忘了当时是执行哪条命令的时候需要启动xp_cmdshell了。。反正是必须用的。。 默认情况下,sql server安装完后,xp_cmdshell是禁用的(可能是安全考虑),如果要使用它,可按以下步骤 -- 允许配置高级选项 EXEC sp_configure 'show advanced options', 1 GO -- 重新配置 RECONFIGURE GO -- 启用xp_cmdshell EXEC sp_configure 'xp_cmdshell', 1 GO --重新配置 RECONFIGURE GO --执行想要的xp_cmdshell语句 Exec xp_cmdshell 'query user' GO --用完后,要记得将xp_cmdshell禁用(出于安全考虑) -- 允许配置高级选项 EXEC sp_configure 'show advanced options', 1 GO -- 重新配置 RECONFIGURE GO -- 禁用xp_cmdshell EXEC sp_configure 'xp_cmdshell', 0 GO --重新配置 RECONFIGURE GO

2012-07-11 · 1 min · bystander

C# 线程优秀文章汇总

最近在看线程的东西,整理一些文档以便学习。分享。 刚刚 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习(五) 多线程的自动管理(定时器) C#多线程学习(六) 互斥对象 C# 实现多线程的同步方法详解 JimmyZheng C# 温故而知新: 线程篇(一) Thread C# 温故而知新: 线程篇(二) 线程池和异步线程 zhoufoxcn C#多线程编程(1):线程的启动 多线程编程(2):线程的同步 多线程编程(3):线程池ThreadPool 多线程编程(4):多线程与UI操作 一个简单的C#多线程间同步的例子 老赵 浅谈线程池(上):线程池的作用及CLR线程池 浅谈线程池(中):独立线程池的作用及IO线程池 浅谈线程池(下):相关试验及注意事项 bloodish C# Tip – 如何优雅的控制线程状态 Autumoon 白话多线程

2012-07-11 · 1 min · bystander

CSV批量导入解决

 最近的一个事就是那个诡异的CSV导入,后来决定用最笨的方法。就是readline,然后确实是可以正常识别了。思路就是一行行读入,然后构造sql语句,保存为sql文件,然后去批量执行sql文件。其实在codeproject找到了一些类似的工具,都有不如意的地方,但是时间关系还没能自己去定制,这件事完成后,就去完善一下大牛们的工具。 因为是多个csv文件,每个文件对应于我们想建的一个表,实际是大约2000个csv文件,每个文件大约4000行数据,构造成对应的sql语句比较简单,需要注意的就是如果sql server表中的字段和关键字重名,那么需要加[],比如我们有个字段是open,那么实际sql语句中使用的时候,比如 CREATE TABLE ( [open] decimal not null, ) 简单的读写以后我们构造了2000个sql文件,然后我们需要执行这些sql文件。。必然需要写个代码来批量执行了。。为此,我先用C#生成一个批处理文件,然后来执行 void GetBat(string InputPath,string OutFile) { DirectoryInfo di = new DirectoryInfo(InputPath); FileInfo[] fi = di.GetFiles(); // Create an array representing the files in the current directory StringBuilder strtemp = new StringBuilder(); foreach (FileInfo fiTemp in fi) { string temp = "osql -S \"127.0.0.1\" -U \"sa\" -P \"broker\" -d \"test_money\" -i \""; temp += fiTemp.FullName.ToString() + "\"\n"; strtemp.Append(temp); } FileStream fs = new FileStream(OutFile, FileMode.OpenOrCreate); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(strtemp); sw.Close(); fs.Close(); } 简单封装了一下,输入参数是文件夹。里面包含我们的所有sql文件。输出为一个批处理文件。。后来。执行下生成的bat文件就可以了。。 osql -S "127.0.0.1" -U "sa" -P "broker" -d "test_money" -i "D:\test\AMKR.sql" osql -S "127.0.0.1" -U "sa" -P "broker" -d "test_money" -i "D:\test\AMLJ.sql" osql -S "127.0.0.1" -U "sa" -P "broker" -d "test_money" -i "D:\test\AMLN.sql" 600M的sql文件执行起来三个多小时。。因为只算一次,所以就不考虑优化了。。鄙视我们吧。

2012-07-06 · 1 min · bystander

C#调用MatLab实现N阶幻方

 MatLab的计算能力太强大了。最近需要通过C#来调用MatLab来进行一些计算,可是MatLab没用过。安装文件在我硬盘里躺了整整一年。 我们希望的是由外部程序调用MatLab函数。所以。希望可以完全脱离MATLAB环境,实现软件的快速开发。为此需要先介绍一下MCR。 MCR简介 MCR的全称是MATLAB Compiler Runtime,即MATLAB编译器运行时。是一个由MATLAB共享类库构成的执行引擎,他能够使MATLAB文件在没有MATLAB的机器上运行。这一点和.NET Framework相对于.NET程序一样,即为程序的运行提供了底层支持。当发布程序的时候,需要将MCR也打包进来,这样没有MATLAB的机器上也能执行,MCR随MATLAB软件一同发布,可以在MATLAB中输入命令“mcr”或者“mcrinstaller”获取其保存路径: >> mcr The WIN32 MCR Installer, version 7.15, is: D:\Program Files\MATLAB\R2011a\toolbox\compiler\deploy\win32\MCRInstaller.exe MCR installers for other platforms are located in: D:\Program Files\MATLAB\R2011a\toolbox\compiler\deploy\<ARCH> <ARCH> is the value of COMPUTER('arch') on the target machine. Full list of available MCR installers: D:\Program Files\MATLAB\R2011a\toolbox\compiler\deploy\win32\MCRInstaller.exe For more information, read your local MCR Installer help. Or see the online documentation at MathWorks' web site. (Page may load slowly.) 根据上面的运行结果,可知该文件的完整路径是: D:\Program Files\MATLAB\R2011a\toolbox\compiler\deploy\win32\MCRInstaller.exe MWArray API简介 MCR包含了文件MWArray.dll,该文件中的API承担了用户程序和MCR之间数据交换的任务,因此,每一个独立文件都需要包含对该文件的引用,否则程序就不能使用MATLAB中的函数,为使用该文件,需要先使用上一步找到的安装MCR,我安装在D:\Program Files\MATLAB\MATLAB Compiler Runtime目录,然后该dll该文件在安装完MCR后位于: D:\Program Files\MATLAB\MATLAB Compiler Runtime\v715\toolbox\dotnetbuilder\bin\win32\v2.0,名字是MWArray.dll, 另外,该文件中有两个重要的命名空间,MathWorks.MATLAB.NET.Arrays和MathWorks.MATLAB.NET.Utility,Arrays命名空间下的类提供从其他任何兼容CLS(Common Language Specification) 语言访问MATLAB中数组的功能,这些类支持数组格式化、类型的特定索引和错误处理的功能。而Utility命名空间下的类提供了对MWArray类架构和MATLAB公共运行时的托管API的通用支持。 实施 为了将MATLAB中的程序作为组件提供给其他.NET程序使用,需要做两方面的工作: 1.将M文件打包为与.NET兼容的程序集 2.在外部程序中添加对程序集的引用 MATLAB端的工作 以我这个功能为例。打开MatLab,然后File->New->Deployment Project.然后在Type里选择.net Assembly,Ok即可。我选择的工程名是test,注意,这个test就会生成一个名为test.dll的程序集,所以起个好名字,,我没起好。如图1 然后在图2的视图中定位到你选择的工程目录,并依次点击。 添加一个test.m的文件。图3 这个名称随意。但是要注意,这个名字必须和你里面将要写的那个函数名称一致,这个很好理解。好了以后,双击test.m就会打开。输入 function m=test(n) m=magic(n); end 创建一个test方法。该方法在C#调用的时候要用到,接受一个参数,然后输出一个幻方。保存关闭m文件,然后回到上图,双击test.prj也就是工程文件。 来到图4 点击Add Class,就是向test.dll的程序集中添加类。我添加了一个类叫做Func1.这个类用来在C#中创建一个对象,然后调用test(n)这个函数,然后出现Add Files,点击打开浏览框,把刚才写好的test.m选上。就可以了 最后看窗口右上角,,点击那个build图标就ok,等个几分钟,就会在目录里生成test.dll文件了。图5 VS端的代码 现在,打开vs,创建C#工程,添加两个引用,分别是MWArray.dll和test.dll,添加引用的方法就是在解决方案资源管理器中,的引用上,点击,然后添加引用->浏览->找到这两个dll,为了方便,我一般会把这两个dll复制到我的C#工程目录里,然后添加引用,如前面所说,MWArray.dll里有两个命名空间,我们使用using语句都添加上。也包括生成的test.dll using test; using MathWorks.MATLAB.NET.Arrays; using MathWorks.MATLAB.NET.Utility; 然后设计C#界面,很简单的拖一个界面,图6 然后单击事件代码: Func1 f = new Func1(); MWNumericArray na = null; MWArray[] ansArray = null; int i = Convert.ToInt16(textBox1.Text); ansArray = f.test(1, i); na = (MWNumericArray)ansArray[0];//只有一个数组返回 MessageBox.Show(na.ToString()); 看到test有两个参数,第一个参数是指返回结果书,我们只需要一个就好了。所以为1,后面那个是阶数了。运行结果如图7: ...

2012-07-02 · 1 min · bystander

C#中的const和readonly

 本文来自《你必须知道的.NET》这本书,是我看书过程中的笔记整理。 不变的量是程序设计中的平衡剂,是系统中恒定不变的量,在.NET中提供哦你了两种方式来实现,const和readonly。其中,const是静态常量,readonly是动态常量。 const,readonly和static readonly定义的常量,一旦初始值指定,(包括在构造函数内指定初始值),将不可更改,可读不可写。 const必须在声明的时候指定初始值,而readonly和static readonly在在声明时可以指定,也可以不指定初始值,同时也可以在构造函数中指定初始值,如果同时在声明时和构造函数中指定了初始值,以构造函数内指定的值为准。 const和static readonly定义的常量是静态的,只能由类型来访问,不能和static同时使用,否则可能出现编译错误,而readonly定义的常量是非静态的,只能由实例对象来访问。可以显式使用static定义静态成员 static readonly常量,如果在构造函数内指定初始值,那么必须是在静态无参构造函数中。不同的构造函数可以为readonly常量实现不同的初始值。 const可以用于定义局部常量和字段常量,而readonly和static readonly不能定义局部变量,只能定义字段常量,实际上,readonly应该被称之为只读字段,因此局限于定义字段,而const才是常量,可以定义字段和局部量。 const常量编译后保存在模块的元数据中,无需在托管堆中分配内存,并且const常量只能是百年机器能够识别的基元类型,比如Int32,string等,而readonly需要分配独立的存储空间,并且可以是任意类型。 const只能应用在值类型和string类型上,其他引用类型常量只能定义为null,否则以new为const引用类型常量赋值,编译器会引发“只能用null对引用类型(字符串除外)的常量进行初始化”错误提示,原因是构造函数初始化是在运行时,而非编译时,readonly只读字段,可以是任意类型,但是对于引用类型字段来说,readonly不能限制对该对象实例成员的访问控制。 总结:尽可能以只读属性来实现对类型读写特性的控制,而不是只读字段,但是在某些情况下,只读字段更简化些。 const是编译时常量,readonly是运行时常量,const较高效,readonly更灵活,在应用上,推荐以static readonly代替const,以平衡const在灵活性上的不足,同时克服编译器优化const性能时,所带来的程序集引用不一致问题。

2012-06-28 · 1 min · bystander

c#温故而知新: 线程篇

上次的C#温故而知新:Stream篇 已经完结了,这次,JimmyZheng 开始更新线程了,转发收藏,持续更新,当然你也可以直接去看JimmyZheng的文章,欢迎学习交流 c#温故而知新: 线程篇(一):Thread c#温故而知新: 线程篇(二):线程池和异步线程

2012-06-24 · 1 min · bystander

WPF实现不规则窗体

这几天在想C# winform程序界面实在太单一,而我C#实现不规则窗体中也说了,如果用背景这种东西来做的话,效果很差,抗锯齿能力基本为0,所以我当时在博客园提问,然后园友有了很给力的回答,比如WPF来做,或者第三方插件,或者深入底层改写ONPaint函数的,今天没事,恰好看到了一篇文章讲这个的,于是,就做一个简单的Demo出来,华丽的效果有木有,先看效果图 在win 7下使用win+Tab切换效果也很华丽。就不演示了。 做起来还算比较简单,首先使用Microsoft Expression Design 4 设计一个界面,破解版什么的太多了,,软件界面和ps挺像,不过功能弱很多,自己操作操作就好了,我说一个问题,就是我当时想画一个空心的圆,也就是一个圆环,ps里大家都知道,直接选区相减就可以了,但是这个死活没找到,基本上最后这个界面所有的地方被找了一遍,猜了猜,才发现了, 具体操作如下,首先汇出一个圆形,然后在圆里面再绘出一个圆形,这时候选中第二次的这个小圆,点击屏幕右侧的那个箭头会出现高级选项, 然后选择混合模式为橡皮擦,就会擦去这个小圆,于是就只剩下一个圆环了。 画好以后,选择文件->导出,按如下设置, 会得到一个xaml文件,一会用 然后新建wpf项目,然后在解决方案资源管理器视图右键点击项目 导入现有项,把上一步的xaml文件导入 然后需要在app.xaml文件中进行设置,具体在<Application.Resources>标签内添加如下代码,中间那个文件名看情况而定。 <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="bystander.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> 然后打开“MainWindow.xaml”文件的设计视图,点击窗体边缘以选中窗体,在属性面板中更改AllowsTransparency及WindowStyle属性。 AllowsTransparency 指示窗体是否支持透明。选中 WindowStyle指示窗体边框样式,设为 None 为无边框。 然后呢在 MainWindow.xaml文件中添加如下代码, Background="{StaticResource back}" MouseDown="Window_MouseDown"> 最终代码是: <Window x:Class="WpfDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525" AllowsTransparency="True" WindowStyle="None" Background="{StaticResource back}" MouseDown="Window_MouseDown"> </Window> 其中background那个是固定的,而MouseDown是为了给窗体写可以拖动的函数,函数名为Window_MouseDown你也可以自己制定 然后对着那个函数名点右键,如下图 导航到事件处理程序,然后在打开的函数里写上 if(e.ChangedButton==MouseButton.Left) this.DragMove(); 拖动功能就实现了。 至于添加关闭按钮的,我就不写了,很简单,代码里都有。可以参考源文件。 工程源码下载:WPFDemo 参考: http://www.cnblogs.com/SkyD/archive/2008/07/13/1242044.html http://www.cnblogs.com/yinyao/archive/2011/05/23/2054056.html

2012-06-23 · 1 min · bystander

GET和POST有什么区别?及为什么网上的多数答案都是错的。

今天突然看到很多好的技术文章,转载收藏备用分享。 如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历 前几天有人问我这个问题。我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用。 这个答案好像并不是他想要的。于是他继续追问有没有别的区别?我说这就是个名字而已,如果服务器支持,他完全可以把GET改个名字叫GET2。他反问道,那就是单纯的名字上的区别喽?我想了想,我觉得如果说再具体的区别,只能去看RFC文档了,还要取决于服务器(指Apache,IIS****)的具体实现。但我不得不承认,我的确没有仔细看过HTTP的RFC文档。于是我说,我对HTTP协议不太熟悉。这个问题也就结束了。 最普遍的答案 回来之后寻思了很久,他到底是想问我什么?我一直就觉得GET和POST没有什么除了语义之外的区别,自打我开始学习Web编程开始就是这么理解的。 可能很多人都已经猜到了,他要的答案是: 1. GET使用URL或Cookie传参。而POST将数据放在BODY中。 2. GET的URL会有长度上的限制,则POST的数据则可以非常大。 3. POST比GET安全,因为数据在地址栏上不可见。 但是很不幸,**这些区别全是错误的,**更不幸的是,这个答案还是Google搜索的头版头条,然而我根本没想着这些是答案,因为在我看来他们都是错的。我来一一解释一下。 GET和POST与数据如何传递没有关系 GET和POST是由HTTP协议定义的。在HTTP协议中,Method和Data(URL, Body, Header)是正交的两个概念,也就是说,使用哪个Method与应用层的数据如何传输是没有相互关系的。 HTTP没有要求,如果Method是POST数据就要放在BODY中。也没有要求,如果Method是GET,数据(参数)就一定要放在URL中而不能放在BODY中。 那么,网上流传甚广的这个说法是从何而来的呢?我在HTML标准中,找到了相似的描述。这和网上流传的说法一致。但是这只是HTML标准对HTTP协议的用法的约定。怎么能当成GET和POST的区别呢? 而且,现代的Web Server都是支持GET中包含BODY这样的请求。虽然这种请求不可能从浏览器发出,但是现在的Web Server又不是只给浏览器用,已经完全地超出了HTML服务器的范畴了。 知道这个有什么用?我不想解释了,有时候就得自己痛一次才记得住。 HTTP协议对GET和POST都没有对长度的限制 HTTP协议明确地指出了,HTTP头和Body都没有长度的要求。而对于URL长度上的限制,有两方面的原因造成: 1. 浏览器。据说早期的浏览器会对URL长度做限制。据说IE对URL长度会限制在2048个字符内(流传很广,而且无数同事都表示认同)。但我自己试了一下,我构造了90K的URL通过IE9访问live.com,是正常的。网上的东西,哪怕是Wikipedia上的,也不能信。 2. 服务器。URL长了,对服务器处理也是一种负担。原本一个会话就没有多少数据,现在如果有人恶意地构造几个几M大小的URL,并不停地访问你的服务器。服务器的最大并发数显然会下降。另一种攻击方式是,把告诉服务器Content-Length是一个很大的数,然后只给服务器发一点儿数据,嘿嘿,服务器你就傻等着去吧。哪怕你有超时设置,这种故意的次次访问超时也能让服务器吃不了兜着走。有鉴于此,多数服务器出于安全啦、稳定啦方面的考虑,会给URL长度加限制。但是这个限制是针对所有HTTP请求的,与GET、POST没有关系。 安全不安全和GET、POST没有关系 我觉得这真是中国特色。我讲个小段子,大家应该可以体会出这个说法多么的可笑。 觉得POST数据比GET数据安全的人会说 _ “防君子不防小人;中国小白多,能防小白用户就行了。”_ _ “哼,”我不以为然,“那你怎么不说,_URL__参数都Encode__过了,或是Base64__一下,小白也看不懂啊。” 那人反驳道,_“_Encode__太简单了,聪明点儿的小白很容易就可以Decode__并修改掉。” 我笑道,_“五十步笑百步耳,再聪明点儿的小白还会截包并重发呢,_Opera__就有这功能。” 那人阴险地祭出神器——最终解释权,说,“这个不算小白。” 我日啊。 最后一点儿感想 我之前一直做Windows桌面应用,对Web开发无甚了解,直到一年多前转做服务器端开发,才开始接触到HTTP。(注意,我说的是HTTP,不是HTML。服务器开放接口是基于REST理念设计的,使用的协议是HTTP,但是传输的内容不是HTML。这不是Web Server,而是一个Web Service) 所以我对于GET和POST的理解,是纯粹地来源于HTTP协议。他们只有一点根本区别,简单点儿说,一个用于获取数据,一个用于修改数据。具体的请参考RFC文档。 如果一个人一开始就做Web开发,很可能把HTML对HTTP协议的使用方式,当成HTTP协议的唯一的合理使用方式。从而犯了以偏概全的错误。 可能有人会觉得我钻牛角尖。我只是不喜欢模棱两可,不喜欢边界不清、概念不明,不喜欢“拿来主义”,也不喜欢被其它喜欢钻牛角尖的人奚落得无地自容。 “知之为知之,不知为不知,是知也。” 原文链接:http://www.cnblogs.com/nankezhishi/archive/2012/06/09/2542968.html

2012-06-19 · 1 min · bystander

gif反转工具

首先看下效果图: 然后是两张gif的对比 //原本图是正着走的 //处理后是倒着走的 gif是动态的嘛。然后我昨天和一个朋友聊天的时候发了一串相同的gif图,然后看着千篇一律的东西。我想能不能写个程序实现gif的初始状态不同呢。什么意思呢。我们知道,gif是由帧构成的,我想实现的功能是比如一个gif共有十帧,那么我写出来的程序能够生成10个gif文件,分别对应不同的初始状态来进行循环。后来一想,gif帧太多的话,比较慢,而且也不实用,于是决定简化一下,只做一个反转工具,比如一个gif是从左到右播放的,通过这个成功可以生成一个相同的gif图,不过是倒着播放的。 思路很简单,就是先把gif分解成很多帧,然后对帧进行合并,合并帧之前把帧的位置反转一下就可以了。因为我自己对图像处理的知识不懂,只想到了思路,所以这些功能都要找些资料,然后修改,测试。 分割帧的代码如下 //解码gif图片 public List<string> GetFrames(string pPath, string pSavedPath) { Image gif = Image.FromFile(pPath); FrameDimension fd = new FrameDimension(gif.FrameDimensionsList[0]); //获取帧数(gif图片可能包含多帧,其它格式图片一般仅一帧) int count = gif.GetFrameCount(fd); List<string> gifList=new List<string>(); //以Jpeg格式保存各帧 for (int i = 0; i < count; i++) { gif.SelectActiveFrame(fd, i); gif.Save(pSavedPath + "\\frame_" + i + ".png", ImageFormat.Png); gifList.Add(pSavedPath + "\\frame_" + i + ".png"); } return gifList; } 可以看到,返回了一个包含所有生成的帧地址的list列表。然后就是使用gifList作为参数来合并了。 //获取系统临时目录存放解码后的png图片 string temppath = System.Environment.GetEnvironmentVariable("TEMP"); List<string> gifList = GetFrames(tBoxFile.Text, temppath); gifList.Reverse(); String outputFilePath = "new.gif"; AnimatedGifEncoder ae = new AnimatedGifEncoder(); ae.Start(outputFilePath); ae.SetDelay(100); // 延迟间隔 ae.SetRepeat(0); //-1:不循环,0:总是循环 播放 for (int i = 0, count = gifList.Count; i < count; i++) { ae.AddFrame(Image.FromFile(gifList[i])); } ae.Finish(); MessageBox.Show("成功!新文件已保存在同目录"); 这里面使用了AnimatedGifEncoder这个类,这是Gif.Components.dll动态连接库里的类(此库开源,文末给出地址),是我在codeProject上找到的。首先我把gifList反转,然后合并保存到同目录。中间生成的帧为了方便我保存到了temp目录。 本来这个库里是分割gif的功能的。但是我实际测试后发现效果非常差,图片黑条泛滥,根本没法看。所以还是使用上面那段代码,相关代码我依然保存在工程里,有兴趣可以自己测试。 明天四级考试,求人品。。 项目源码:gif反转工具 参考: C#图片处理:获取GIF 动画图片中的各个帧 NGif, Animated GIF Encoder for .NET

2012-06-15 · 1 min · bystander