7月 22

nuget安装

Install-Package Microsoft.AspNet.SignalR

written by ocean

6月 07

code first是ef的三种方式中的一种,更确切的名字叫 code only.

另外两种是database first && model first

通过在code中定义,生成对应的数据库。记录一下学习笔记

 

首先创建项目,并且用nuget引用EntityFramework,我这里用的6.1.3的版本,对了,vs用的2013.

web.config添加链接字符串

  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=172.28.3.20;Initial Catalog=db_test;User ID=sa;password=abc123;" providerName="System.Data.SqlClient" />
  </connectionStrings>

创建两个Entity

UserInfo.cs

    public class UserInfo
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; } 
        public ICollection<Order> Orders { get; set; }
    }

Order.cs

    public class Order
    {
        [Key]
        public int Id { get; set; }
        public string Context { get; set; }
        //一个订单只能有一个用户
        public UserInfo UserInfo { get; set; }
    }

创建OceanDbContext

    public class OceanDbContext:DbContext
    {
        public OceanDbContext(): base("name=DefaultConnection")//此与配置文件相对应.
        {}
        public DbSet<UserInfo> UserInfo { get; set; }
        public DbSet<Order> Orders { get; set; }
    }

调用测试

        static void Main(string[] args)
        {
            //创建上下文
            OceanDbContext db = new OceanDbContext();
            //创建表且将字段加入进去
            UserInfo userInfo = new UserInfo();
            userInfo.Name = "du";
            userInfo.Email = "dddd";
            //将表加入到数据库中
            db.UserInfo.Add(userInfo);
            //保存之
            db.SaveChanges();
            Console.WriteLine("成功创建数据库和表");
            Console.ReadKey();
        }

 查看数据库即可发现表已经建立,并且数据也已经加入了表中。

code first 配置修改有两种

其一为attrubte做声明,

第二种为FluentAPI,以覆盖的方式实现。

written by ocean

1月 26

找了一份不错的源码,学习一下验证码识别

第一步当然是批量下载验证码了

        static void Main(string[] args)
        { 
            string downloadPath = Path.Combine(Config.Root, @"yzm\58"); 
            for (int index = 0; index < 200; index++)
            { 
                Random r = new Random(); 
                string url = "https://passport.58.com/validatecode?temp=123ijv4f6wg&t=" + r.Next(1, 9999);
                SaveCodeImageFromUrl(url, downloadPath + "\\" + index + ".jpg"); 
            }
        }


        public static void SaveCodeImageFromUrl(string url, string path)
        {

            WebRequest re = WebRequest.Create(url);
            WebResponse rp = re.GetResponse();
            Stream s = rp.GetResponseStream();
            Image img = Image.FromStream(s);
            s.Close();
            s.Dispose();
            img.Save(path);
        }

第二步,灰度处理

        static void Main(string[] args)
        { 
            string downloadPath = Path.Combine(Config.Root, @"yzm\58\");

            var files=Directory.GetFiles(downloadPath+"old");
            foreach (var file in files)
            {
                Image img = Image.FromFile(file);
                Image img_grey = (Image)img.Clone();

                string imgOriginal = Image2Num((Bitmap)img_grey);


                if (!Directory.Exists("experiment\\"))
                {
                    Directory.CreateDirectory("experiment\\");
                }
                //imgurl = pborigin.ImageLocation;
                WriteToFile(imgOriginal, "experiment\\" + Path.GetFileNameWithoutExtension(file) + "_original.txt");
                 
                img_grey = ImageProcess.Gray((Bitmap)img_grey, 2);
                string imgGreied = Image2Num((Bitmap)img_grey);
                WriteToFile(imgGreied, "experiment\\" + Path.GetFileNameWithoutExtension(file) + "_greied.txt");

                img_grey.Save(Path.Combine(Config.Root, @"yzm\58\huidu\") + Path.GetFileName(file));

            }
             


        }

        /// <summary>
        /// 将数据写入文件
        /// </summary>
        /// <param name="data"></param>
        /// <param name="path"></param>
        public static void WriteToFile(string data, string path)
        {
            File.WriteAllText(path, data);
        }

        /// <summary>
        /// 图片转换成像素数值
        /// </summary>
        /// <param name="img"></param>
        /// <returns></returns>
        #region 图片转换成像素数值
        public static string Image2Num(Bitmap img)
        {

            StringBuilder sb = new StringBuilder();
            string imgPixel = "";
            int height = img.Height;
            int width = img.Width;
            BitmapData bdata = img.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
            int bytelength = width * height * 4;
            byte[] bytes = new byte[bytelength];
            Marshal.Copy(bdata.Scan0, bytes, 0, bytelength);
            int row = 1;
            for (int i = 0; i < bytelength; i += 4)
            {
                imgPixel = bytes[i] + "," + bytes[i + 1] + "," + bytes[i + 2];
                if (imgPixel.Length < 11)
                {
                    for (int j = 0; j < 11 - imgPixel.Length; j++)
                    {
                        imgPixel += " ";
                    }
                }
                imgPixel += "\t";
                sb.Append(imgPixel);
                if (row % width == 0)
                {
                    sb.Append("\r\n");
                }
                row++;
            }
            img.UnlockBits(bdata);
            return sb.ToString();
        }
        #endregion

written by ocean

1月 13

加载网址

            webBrowser1.Navigate("http://blog.wx6.org");

根据id找到按钮,然后点击

            HtmlElement tab = webBrowser1.Document.GetElementById("mobileRegTab").FirstChild;
            tab.InvokeMember("Click");

查找元素,获取值,设置值

        //根据Name获取元素
        public HtmlElement GetElement_Name(WebBrowser wb, string Name)
        {
            HtmlElement e = wb.Document.All[Name];
            return e;
        }

        //根据Id获取元素
        public HtmlElement GetElement_Id(WebBrowser wb, string id)
        {
            HtmlElement e = wb.Document.GetElementById(id);
            return e;
        }

        //根据Index获取元素
        public HtmlElement GetElement_Index(WebBrowser wb, int index)
        {
            HtmlElement e = wb.Document.All[index];
            return e;
        }

        //获取form表单名name,返回表单
        public HtmlElement GetElement_Form(WebBrowser wb, string form_name)
        {
            HtmlElement e = wb.Document.Forms[form_name];
            return e;
        }

        //设置元素value属性的值
        public void Write_value(HtmlElement e, string value)
        {
            e.SetAttribute("value", value);
        }

        //执行元素的方法,如:click,submit(需Form表单名)等
        public void Btn_click(HtmlElement e, string s)
        { 
            e.InvokeMember(s);
        }

written by ocean \\ tags: ,

1月 01

新年的鞭炮声刚过,我还在苦逼的Coding,不过依然自得其乐。

这篇记录一下C#调用VC++的DLL里的方法

其实VC++完全一窍不通呀,不过为了新的项目,我决定拼了。顺祝自己好运

首先,建立VC++的项目,选择Win32的DLL项目

在Source Files里添加OceanTest.cpp

#include "stdafx.h"

extern "C" __declspec(dllexport) int Add(int a, int b)
{
	return a + b;
}

extern "C" __declspec(dllexport) int Add2(int a, int b)
{
	return a + b + 2;
}

里面定义了两个方法,编译之后产生一个XXX.DLL 

建立C#工程,类型任意,测试用的winform

讲刚才生成的XXX.DLL复制到bin的debug目录下

调用如下

        private void button1_Click(object sender, EventArgs e)
        {

            int c = Add(5, 7);
            int cc = Add2(5, 7);

        }


        [DllImport("XXX.dll", EntryPoint = "Add", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
        public static extern int Add(int a, int b);


        [DllImport("XXX.dll", EntryPoint = "Add2", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
        public static extern int Add2(int a, int b);

 

完美!!! 

补充一下字符串型的调用,这个和int的不太一样

C++ Code

extern "C" __declspec(dllexport) void DES_Encrypt(char*  sz_encrypt)
{ 
	strcpy(sz_encrypt, "ccccccc"); 
}

C#中定义

        [DllImport("xxx.dll", EntryPoint = "DES_Encrypt",  CallingConvention = CallingConvention.Cdecl)]
        public extern static void DES_Encrypt(StringBuilder sz_encrypt);
    }

C#调用

            var output = new StringBuilder();
            DES_Encrypt(output);

written by ocean \\ tags:

12月 01

研究一点东西,发现在浏览器中本身无法实现,学习一下ActiveX控件。

 

测试环境为VS2008+.net framework3.5+ie 11。

首先新建一个类库项目WX6.DuanXinHongZhaJi.ActiveXLib

更改“项目属性-应用程序-程序集信息”设置,勾选“使程序集 COM 可见

更改“项目属性-生成”设置,勾选“为 COM 互操作 注册

修改AssemblyInfo.cs文件

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; 

using System.Security;


// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("WX6.DuanXinHongZhaJi.ActiveXLib")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("WX6.DuanXinHongZhaJi.ActiveXLib")]
[assembly: AssemblyCopyright("Copyright ©  2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(true)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("1a347ac4-1afb-4504-a151-b666bfe414fc")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

添加接口文件(为了解决浏览器安全设置对控件的影响,必须在组件中加入IObjectSafety接口)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace WX6.DuanXinHongZhaJi.ActiveXLib
{
    [ComImport, GuidAttribute("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IObjectSafety
    {
        [PreserveSig]
        int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);

        [PreserveSig()]
        int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
    }
}

添加用户控件Uc.cs 并且实现接口

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;//Guid引用

namespace WX6.DuanXinHongZhaJi.ActiveXLib
{
    [Guid("0b6ed426-9e67-4cf3-99da-8a346a98e558")]
    public partial class Uc : UserControl
    {



        public string GetStr()
        {
            return "这是从ActiveX传过来的值,from:blog.wx6.org";
        } 

        public Uc()
        {
            InitializeComponent();
        }


        #region IObjectSafety 成员
        private const string _IID_IDispatch = "{00020400-0000-0000-C000-000000000046}";
        private const string _IID_IDispatchEx = "{a6ef9860-c720-11d0-9337-00a0c90dcaa9}";
        private const string _IID_IPersistStorage = "{0000010A-0000-0000-C000-000000000046}";
        private const string _IID_IPersistStream = "{00000109-0000-0000-C000-000000000046}";
        private const string _IID_IPersistPropertyBag = "{37D84F60-42CB-11CE-8135-00AA004BB851}";

        private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
        private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
        private const int S_OK = 0;
        private const int E_FAIL = unchecked((int)0x80004005);
        private const int E_NOINTERFACE = unchecked((int)0x80004002);

        private bool _fSafeForScripting = true;
        private bool _fSafeForInitializing = true;

        public int GetInterfaceSafetyOptions(ref Guid riid, ref int pdwSupportedOptions, ref int pdwEnabledOptions)
        {
            int Rslt = E_FAIL;

            string strGUID = riid.ToString("B");
            pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
            switch (strGUID)
            {
                case _IID_IDispatch:
                case _IID_IDispatchEx:
                    Rslt = S_OK;
                    pdwEnabledOptions = 0;
                    if (_fSafeForScripting == true)
                        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
                    break;
                case _IID_IPersistStorage:
                case _IID_IPersistStream:
                case _IID_IPersistPropertyBag:
                    Rslt = S_OK;
                    pdwEnabledOptions = 0;
                    if (_fSafeForInitializing == true)
                        pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;
                    break;
                default:
                    Rslt = E_NOINTERFACE;
                    break;
            }

            return Rslt;
        }

        public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions)
        {
            int Rslt = E_FAIL;
            string strGUID = riid.ToString("B");
            switch (strGUID)
            {
                case _IID_IDispatch:
                case _IID_IDispatchEx:
                    if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_CALLER) && (_fSafeForScripting == true))
                        Rslt = S_OK;
                    break;
                case _IID_IPersistStorage:
                case _IID_IPersistStream:
                case _IID_IPersistPropertyBag:
                    if (((dwEnabledOptions & dwOptionSetMask) == INTERFACESAFE_FOR_UNTRUSTED_DATA) && (_fSafeForInitializing == true))
                        Rslt = S_OK;
                    break;
                default:
                    Rslt = E_NOINTERFACE;
                    break;
            }

            return Rslt;
        }

        #endregion
    }


 
}

 

好了,接下来为解决方案添加一个安装项目WX6.DuanXinHongZhaJi.SetupActiveX

为setup项目的removepreviousversions设置为true(MSDN解释:设为true,安装程序检查是否有早期版本;一经发现,便会立即将其卸载。)

在项目上点右键,【添加】->【项目输出】,选择上边的项目

最后得到两个文件 setup.exe  WX6.DuanXinHongZhaJi.SetupActiveX.msi

新建一个web项目 WX6.DuanXinHongZhaJi.Test
将刚才生成的两个文件放在web项目的lib文件夹下

页面测试代码

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WX6.DuanXinHongZhaJi.Test._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
    
     <script type="text/javascript">
       function passValue()
       {  
 document.getElementById("textValue").value=document.getElementById("helloBossma").GetStr();
       }
    </script>
    
</head>
<body>

 <object classid="clsid:0b6ed426-9e67-4cf3-99da-8a346a98e558" codebase="lib/setup.exe"
        width="200" height="40" id="helloBossma">
 </object>
 
 
    <form id="form1" runat="server">
 <div>
        <input id="textValue" type="text" />
        <input id="Button1" type="button" value="传值" onclick="passValue()"/>
    </div>
    </form>
</body>
</html>

注意classid要和上面的对应。

 

然后run一下就发现可以调用了。

最后,如果浏览器中没有提示安装activex控件,请设置浏览器的安全项目。

written by ocean \\ tags:

10月 29

一个服务,总是莫名其妙的卡主,不知道卡在了什么地方,最近也没时间修复。

每次都是通过重启来搞定的,时间长了有点烦

所以打算给整个方法设置执行上限,超过时长则自动重启

网上找了下,发现还是用的TPL做的

 

记录一下代码

        static void Main(string[] args)
        {

            var tokenSource = new CancellationTokenSource();
            CancellationToken token = tokenSource.Token;
            int timeOut = 5000; // 5ms

            var task = Task.Factory.StartNew(() => TargetMethod(), token);

            if (!task.Wait(timeOut, token))
            {
                  Console.WriteLine("The Task timed out!"); 
            } 
        }

        public static object TargetMethod()
        {
            for (int index = 0; index < 100; index++)
            {
                Thread.Sleep(300);
                Console.WriteLine(index);
            }
            return null;
        }

written by ocean

5月 29

SqlTransaction是System.Data.SqlClient命名空间下的一个事务类,

主要方法有Commit()和Rollback()两个函数

sqlConn.BeginTransaction()表示事务的开始,在执行一些基本操作后(代码是执行一个insert和一个update)后,

执行sqlTrans.Commit();表示事务提交

在第二个执行update的时候发生类型转化错误

catch的地方用Rollback回滚,第一条添加的数据也不见了

written by ocean

3月 03

延迟加载,亦称延迟实例化,延迟初始化等,主要表达的思想是,把对象的创建将会延迟到使用时创建,而不是在对象实例化时创建对象,即用时才加载。这种方式有助于提高于应用程序的性能,避免浪费计算,节省内存的使用等。

代码很简单

延迟加载主要应用场景

当创建一个对象的子对象开销比较大时,而且有可能在程序中用不到这个子对象,那么可以考虑用延迟加载的方式来创建子对象。另外一种情况就是当程序一启动时,需要创建多个对象,但仅有几个对象需要立即使用,这样就可以将一些不必要的初始化工作延迟到使用时,这样可以非常有效的提高程序的启动速度。

written by ocean

2月 20

.net 4.0里面有一个dynamic方法,出来很久了,但是我一直没有看过

今天试了一下,乖乖,不得了,这个不就是我很久以前希望的方法么

有一点类似于javascritp的方法

       function Test(message){
          var showMessage = function (_msg) {    
           alert(_msg)
            };
          message =  + message;
          showMessage(message);
          };
        Test("[Test]");

 

注意红色部分

其实说白了就是临时方法

因为在实际开发中可能经常有一些临时性的类,专门建一个.cs文件有一点浪费

写在某个类下面又不够优雅,那个时候我就想要是有一个这样的方法多好

dynamic应该有很多其它的用法,但是对我来说,我更欣赏的就是这个功能了

废话不说,上代码

看看 ,多优雅的一个方法啊

当然了,对代码优雅的追求,连SayDelegate这个方法我也不想有,新的代码

关于Action和Func,备忘以前的一篇文章

 

written by ocean