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")