C# 总结 -- 随笔

//////////////文件指定位置写入数据
把字符串 "abcd "插入到test.txt文件中的第10个字节处 
FileStream   fs=new   FileStream(@ "c:\test.txt ",Append) 
buf=Encoding.ASCII.GetBytes( "abcd "); 
FileStream.Seek(10,Begin); 
FileStream.Write(buf);
//////////////调用外部DLL时提示“无法嵌入互操作类型”
右击引用的类库,属性
——双击嵌入互操作类型(改为false)即可

//////////////全局字符集修改
<system.web>
<globalization   requestEncoding= "gb2312"   responseEncoding= "gb2312"  fileEncoding= "gb2312"     culture= "zh-CN"/>

  </system.web>
//////////////.Net3.5 .Net4部署在同一网站下

各自布置一个虚拟目录,分别指定应用程序池,
主目录里不能有web.config
//////////////.Net 强名称签名程序集

项目——属性——签名——选中为程序集签名——选择强名称密钥文件——新建
重新编译即可
多用于作为COM组件与其他程序交互
强名称签名的程序集如果被篡改,那么CLR在加载该程序集进行完整性验证的时候就会失败。
但是强名称可以通过其他工具去除。

///////////////.Net Framework 4.5 zip压缩原生支持
必须引用项目的 System.IO.Compression.FileSystem 程序集
using System.IO.Compression;
string startPath = @"c:\example\start";
string zipPath = @"c:\example\result.zip";
string extractPath = @"c:\example\extract";
//压缩
ZipFile.CreateFromDirectory(startPath, zipPath);
//解压
ZipFile.ExtractToDirectory(zipPath, extractPath);
/////////////////开发64位系统中以32位运行的程序

项目属性——生成——目标平台——选择x86

/////////////////.Net WebService 调用url

系统调用时WebService路径,会在dll里
反编译dll后可以发现
*.Properties.Settings中每个服务字符串上有一个DefaultSettingValue就是我们在Settings中设置的路径。

更改此路径:Web项目中的WebService调用可以直接修改Web.Config中对应值。
dll中可以用new Service().Url赋值修改。
/////////////////64位IIS 操作Word Excel问题

DCOM权限不够
mmc -32 
添加管理单元——组件服务
进入DCOM——Microsoft Word *或{00020906-0000-0000-C000-000000000046}
属性——安全——全部自定义,添加everyone所有权限——标识选交互式用户(不行就下列用户输入超级管理员)
//////////////////.net 转义包含转义的字符串

Regex.Unescape(string)
传入字符串内容(\为实体字符):    "a\r\n\tb"
返回字符串:    "a
    b"

//////////////////WinForm中,给TextBox文本框增加Ctrl+A全选快捷键。 
        private void txtStatus_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A)
            {
                ((TextBox)sender).SelectAll();
            }
        }
///////////////////C# IIS ManagementException: 访问遭到拒绝
原理:页面(与IIS有关)运行的权限低于DLL运行的权限,估计是微软考虑到什么黑客会利用此漏洞而设计的。只要在Global里或httpModules把这个值获取就没问题。
实时获取CPU内存情况可以在Global中每隔5秒刷新一次值。
////////////////////C#命令行程序中执行命令行程序并显示输出
ProcessStartInfo start = new ProcessStartInfo("dtexec.exe");
start.Arguments = " /F \"" + AppPath + "\\更新数据.dtsx\" /De 1";
start.CreateNoWindow = true;//不显示dos命令行窗口
start.RedirectStandardOutput = true;//
start.RedirectStandardInput = true;//
start.UseShellExecute = false;//是否指定操作系统外壳进程启动程序
Process p = Process.Start(start);
StreamReader reader = p.StandardOutput;//截取输出流
string line = reader.ReadLine();//每次读取一行
while (!reader.EndOfStream)
{
Console.WriteLine(line);
line = reader.ReadLine();
}
p.WaitForExit();//等待程序执行完退出进程
p.Close();//关闭进程
reader.Close();//关闭流
////////////////////////VS.NET 编译出来的DLL,XML注释(Sumarry 注释)输出

项目属性——生成——输出中选中xml文档文件——生成即可
///////////////////////网站报错时,自动跳转到指定报错页(error.html)的办法
ASP.NET在web层的web.config下进行如下配置:
  当web层中的页面报错时,会自动跳转到根目录下的error.htm页面,提示用户,非常人性化。 
  <system.web>
   <customErrors mode="On" defaultRedirect="~/error.htm"></customErrors>
  </system.web>
////////////////////////文件下载
WebClient client = new WebClient();
try
{
    client.DownloadFile(uri, savePath);
}
catch
{
}


////////////////////////RavenDb中的Task异步应用.Net4
internal partial class RavenService : ServiceBase{
        private RavenDbServer server;
        private Task startTask;
        public RavenService()
        {
                InitializeComponent();
        }
        protected override void OnStart(string[] args)
        {
                //单独开启一个线程启动服务
                startTask = Task.Factory.StartNew(() =>
                {
                        try
                        {
                                server = new RavenDbServer(new RavenConfiguration());
                        }
                        catch (Exception e)
                        {
                                EventLog.WriteEntry("RavenDB service failed to start because of an error" + Environment.NewLine + e, EventLogEntryType.Error);
                                Stop();
                        }
                });
                //等待20秒还没有启动则提示
                if(startTask.Wait(TimeSpan.FromSeconds(20)) == false)
                {
                        EventLog.WriteEntry(
                                "Startup for RavenDB service seems to be taking longer than usual, moving initialization to a background thread",
                                EventLogEntryType.Warning);
                }
        }
        protected override void OnStop()
        {
                //异步等待销毁服务
                startTask.ContinueWith(task =>
                {
                        if (server != null)
                                server.Dispose();
                        return task;
                }).Wait();
        }
}

/////////////////winform获取拖动到控件上的文件路径
设置控件的AllowDrop=true
在DropEnter事件中编写代码:
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
        string filePath=((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
}


//////////////////XMLDocument出错:要插入的节点出自不同的文档上下文  
通过XmlDocument.ImportNode将节点先导入到当前文档中。
xn = xd.ImprotNode(xn);
xnP.AppendChild(xn);

//////////////////显示注册表二进制值
string strA = "44,00,3a,00,00,00";
string[] arrA = strA.Split(',');
List<byte> listB = new List<byte>();
for (int i = 0; i < arrA.Length;i+=2 )
{
    string strN = arrA;
    listB.Add((byte)Convert.ToInt32(strN, 16));
}
string strResult = Encoding.GetEncoding("GB2312").GetString(listB.ToArray());


//////////////////byte转16进制字符串并填充两位数字
b.ToString("X2")

posted @ 2013-03-27 16:37  欧西  阅读(399)  评论(0编辑  收藏  举报