原文出自:http://blog.csdn.net/oyi319/article/details/5753311

1.全局程序集GlobalAssemblyInfo.cs

我们编写的一个解决方案,通常会包含多个项目,而每个项目都有单独的程序集信息AssemblyInfo.cs。但是,你会发现一个问题,这些AssemblyInfo.cs当中有一部分在重复的,若能把它们提取出来放入一个单一文件中,修改AssemblyInfo中的诸如产品名、产品版本、版本等信息会变得轻松。那么,这个程序集信息文件,我们叫做它——GlobalAssemblyInfo.cs

制作步骤:

  1. 在解决方案中添加名为GlobalAssemblyInfo.cs的C#类文件
  2. 清除GlobalAssemblyInfo.cs中的代码,然后将如下代码粘贴进去
    /* ==============================
    * 全局程序集信息
    * GlobalAssemblyInfo.cs
    *
    * 请把此文件引用到其他的项目中
    ==============================*/ using System.Reflection;
    using System.Runtime.InteropServices; [assembly: ComVisible(false)]
    [assembly: AssemblyProduct("全局程序集和能输出调试信息到控制台的WinForm项目的演示")]
    [assembly: AssemblyCompany("Oyi319的公司")]
    [assembly: AssemblyVersion(RevisionClass.FullVersion)]
    #if DEBUG
    [assembly : AssemblyConfiguration("Debug")]
    #else
    [assembly: AssemblyConfiguration("Release")]
    #endif
    [assembly: AssemblyCopyright("版权所有 2010 Oyi319")]
    [assembly: AssemblyTrademark("")]
    [assembly: AssemblyCulture("")] internal static class RevisionClass
    {
    public const string Major = "";
    public const string Minor = "";
    public const string Build = "";
    public const string Revision = ""; public const string MainVersion = Major + "." + Minor;
    public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;
    } /* 其他程序集的AssemblyInfo.cs简化如下内容
    所有信息数据单独填写 using System;
    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices; [assembly: AssemblyTitle("程序集标题")]
    [assembly: AssemblyDescription("程序集描述")] // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
    [assembly: Guid("6a6263f2-35d2-4077-a1aa-cc775ca7cf84")] [assembly: CLSCompliant(true)]
    [assembly: StringFreezing()]
    */
  3. 为每个项目引用GlobalAssemblyInfo.cs文件。
    右键项目->添加->现有项,浏览到GlobalAssemblyInfo.cs文件,注意点击“添加”下拉菜单的“添加为链接”将它添加到项目,
    然后将这个链接到GlobalAssemblyInfo.cs的文件移到到Properties文件夹下,使它与AssemblyInfo.cs处于同一个文件夹
  4. 修改AssemblyInfo.cs文件,将GlobalAssemblyInfo.cs中已经包含的信息去除,例如:
    using System;
    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices; [assembly: AssemblyTitle("程序集标题")]
    [assembly: AssemblyDescription("程序集描述")] // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
    [assembly: Guid("6a6263f2-35d2-4077-a1aa-cc775ca7cf84")] [assembly: CLSCompliant(true)]
    [assembly: StringFreezing()]
  5. 将其他需要全局程序集的项目做同样处理,最后的“解决方案资源管理器”窗口的截图类似这样:

2.WinForm程序和控制台窗口Console

如果你调试过SharpDevelop的源程序,会发现它在DEBUG模式时会出现一个控制台窗口,以显示日志信息。或许我使用的方法与其不同,不过你可以试一试,写出我们自己的调试日志代码。

首先要解决的问题是如何在Debug模式时显示Console窗口。我确定,这是一个WinForm项目,也没有改过它的输出类型。我们需要在项目的入口点使用一些API函数将控制台显示出来:

它们是 AllocConsole 和 FreeConsole。

[DllImport("kernel32.dll")]
public static extern Boolean AllocConsole();
[DllImport("kernel32.dll")]
public static extern Boolean FreeConsole();

然后我们使它在Main()开始处判断DEBUG编译标记,调用AllocConsole方法显示控制台,然后在Main()的结束处判断DEBUG编译标记,调用FreeConsole方法关闭控制台。这样,我们就可以使用Console.Write等方法将调试信息显示在这个控制台窗口里。

为了达到更好的效果,我们写一个Shell类,用它来封装Console.WriteLine方法,输出个性化信息。我是这样做的,根据输出到控制台的文本的前几个字判断为“警告”、“错误”、“注意”时,输出带有黄色、红色、绿色的文字,其他输出信息输出控制台缺省的灰色文字,以起到区分效果,还要在每条信息前加上输出信息的当时时间。

这个Shell类是这样的:

/// <summary>
/// 与控制台交互
/// </summary>
static class Shell
{
/// <summary>
/// 输出信息
/// </summary>
/// <param name="format"></param>
/// <param name="args"></param>
public static void WriteLine(string format, params object[] args)
{
WriteLine(string.Format(format, args));
} /// <summary>
/// 输出信息
/// </summary>
/// <param name="output"></param>
public static void WriteLine(string output)
{
Console.ForegroundColor = GetConsoleColor(output);
Console.WriteLine(@"[{0}]{1}", DateTimeOffset.Now, output);
} /// <summary>
/// 根据输出文本选择控制台文字颜色
/// </summary>
/// <param name="output"></param>
/// <returns></returns>
private static ConsoleColor GetConsoleColor(string output)
{
if (output.StartsWith("警告")) return ConsoleColor.Yellow;
if (output.StartsWith("错误")) return ConsoleColor.Red;
if (output.StartsWith("注意")) return ConsoleColor.Green;
return ConsoleColor.Gray;
}
}

那么程序入口函数Main代码如下:

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
#if DEBUG
AllocConsole();
Shell.WriteLine("注意:启动程序..."); Shell.WriteLine("/tWritten by Oyi319");
Shell.WriteLine("/tBlog: http://blog.csdn.com/oyi319");
Shell.WriteLine("{0}:{1}", "警告", "这是一条警告信息。");
Shell.WriteLine("{0}:{1}", "错误", "这是一条错误信息!");
Shell.WriteLine("{0}:{1}", "注意", "这是一条需要的注意信息。");
Shell.WriteLine("");
#endif
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
#if DEBUG
Shell.WriteLine("注意:2秒后关闭...");
Thread.Sleep();
FreeConsole();
#endif
}

现在这个控制台窗口,只会在DEBUG模式时显示,而在Release编译时不会出现。 这是不是你想要的调试方法呢?

全局程序集GlobalAssemblyInfo.cs进行版本控制(引)的更多相关文章

  1. 如何在.net项目中使用全局程序集GAC

    在解决已有.net网站问题过程中(之前的同事写的),发现出现dll不存在的情况,build报错 在bin目录下找不到该dll,后来发现是全局程序集,存储在C:\Windows\assembly目录下 ...

  2. C#程序集系列11,全局程序集缓存

    全局程序集缓存(GAC:Global Assembly Cache)用来存放可能被多次使用的强名称程序集.当主程序需要加载程序集的时候,优先选择到全局程序集缓存中去找寻需要的程序集. 为什么需要全局程 ...

  3. C#-VS程序集

    程序集即代码组,可以是单个文件或多个文件,按一个整体部署,但可指定自身调用其他程序集的版本. 推出原因 为解决dll地狱而推出,也可解决其他问题.dll地狱,a应用使用dll版本1,b应用使用dll版 ...

  4. C#程序集系列12,C#编译器和CLR如何找寻程序集

    本篇体验C#编译器和CLR运行时如何查找程序集,并自定义CLR运行时查找程序集的方式. □ C#编译器和CLR运行时如何查找程序集 C#编译器在哪里?--在C:\Windows\Microsoft.N ...

  5. 【C#基础概念】程序集Assembliy

    一.      程序集定义 二.      程序集结构 通常,静态程序集可能由以下四个元素组成: 程序集清单(manifest) 类型元数据metadata和程序集元数据. 实现这些类型的 Micro ...

  6. 《精通C#》十四章-.NET程序集入门

    在书中,这一章节的开头说的是自定义命名空间和使用命名空间,在以我目前有限的经验来说,程序集就是一个类库经过编译之后,所生成的一个在引用命名空间,进而使用该文件中已经定义好的字段,属性以及方法的文件,以 ...

  7. C# 动态加载程序集信息

    本文通过一个简单的实例,来讲解动态加载Dll需要的知识点.仅供学习分享使用,如有不足之处,还请指正. 在设计模式的策略模式中,需要动态加载程序集信息. 涉及知识点: AssemblyName类,完整描 ...

  8. rest-framework解析器,url控制,分页,响应器,渲染器,版本控制

    解析器 1.json解析器 发一个json格式的post请求.后台打印: request_data---> {'title': '北京折叠'} request.POST---> <Q ...

  9. .Net高级技术——程序集

    程序集(Assembly),可以看做是一堆相关类打一个包,相当于java中的jar包(*).打包的目的:程序中只引用必须的程序集,减小程序的尺寸:一些程序集内部的类不想让其他程序集调用. 我们调用的类 ...

随机推荐

  1. 传智播客JavaWeb day01 快捷键、XML

    2015-01-14 一直计划着学习java,今天晚上终于下定决心看了下传智播客朴乾老师的javaweb开发视频day01之第一讲,主要内容是开发工具简单介绍.怎么创建工程.Junit的介绍,我是C# ...

  2. js去掉空格

    去除字符串左右两端的空格,在vbscript里面可以轻松地使用 trim.ltrim 或 rtrim,但在js中却没有这3个内置方法,需要手工编写.下面的实现方法是用到了正则表达式,效率不错,并把这三 ...

  3. Carthage

    Carthage Carthage - 一个简单.去集中化的Cocoa依赖管理器

  4. CentOS下安装keepalived 进行服务器热备

    一.准备: 1.1 安装依赖软件 如果系统为基本文本安装,需要安装一下软件  yum -y install ipvsadm yum -y install kernel kernel-devel reb ...

  5. cookie 和 session 机制

    cookie机制 Cookie实际上是Web服务端与客户端(典型的是浏览器)交互时彼此传递的一部分内容,内容可以是任意的,但要在允许的长度范围之内.客户端会将它保存在本地机器上(如IE便会保存在本地的 ...

  6. Qt之QPropertyAnimation

    简述 QPropertyAnimation类定义了Qt的属性动画. QPropertyAnimation以Qt属性做差值,作为属性值存储在QVariants中,该类继承自QVariantAnimati ...

  7. git不能提交jar的设置

      项目目录下 文件:.gitignore ,里面设置: *.class # Package Files # *.jar *.war *.ear 删除*.jar

  8. MySQL数据库恢复的经历。

    蛋疼,定时任务设置错误.把数据给删除了.还有一次是服务器时间不对,也把数据给删除了. 还好,开启了二进制日志,才算把数据找回,但是速度效率也太低. 痛定思变.在把一切交由电脑工作的时候,也要做好一定的 ...

  9. 触摸精灵lua脚本实现微信群加好友功能

    --此脚本针对iPhone5/5s --目前只实现一个屏幕微信群好友的添加,如果想添加更多好友, --需要划屏操作,执行划屏操作时建议循环滑动 function main() --获取屏幕的分辨率 w ...

  10. 光流算法:Brox算法(转载)

    参考论文:1. High Accuracy Optical Flow Estimation Based on a Theory for Warping, Thomas Box, ECCV20042. ...