Unity 学习笔记(2) — 配置文件的使用

318 views 四月 25, 09 by Timothy

在Unity的配置中,使用配置文件也是一种非常灵活的方式,毕竟能够通过修改配置文件的文本就能达到改动的目的,而不需要对源码进行改动、重新编译。使用配置文件对Unity进行配置,需要增加两个程序集的引用:System.Configuration和Microsoft.Practices.Unity.Configration,并且在代码中用相应的两个命名空间:

   1:  using System.Configuration;
   2:  using Microsoft.Practices.Unity.Configuration;

此外,需要修改应用程序的配置文件:

在configSections节点中,加入Unity的section配置信息


<configSections>
...
<section name="unity"
type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</configSections>
<configSections>
...
<section name="unity"
type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</configSections>

其中name是section的名称,type就是处理该section的程序类型,Unity提供了UnityConfigurationSection,负责处理配置文件信息,它包含在程序集Microsoft.Practices.Unity.Configuration中

接下来,需要在configuration节点中增加Unity配置节点,格式如下:

   1:  <unity>
   2:      <typeAliases>
   3:        <typeAlias alias="" type="" />
   4:      <typeAliases />
   5:      <containers  >
   6:        <container>
   7:           <types>
   8:             <type type="" mapTo="" />
   9:           </types>
  10:           <instances>
  11:             <add name="" type="" value="" />
  12:           </instances>
  13:        </container>
  14:      </containers>
  16:  </unity>

unity的子元素,包含节点大致如上,其宗typeAliases是type别名,能够简化下面types中type的配置。containers节点中可以包含多个container的配置。container主要包含的子元素有types元素,instance元素,types元素可以包含多个type元素,用以添加注册类型,instance主要用来添加实例到容器中。type元素,主要包含四个属性:

name:表示注册类型的名称,此属性在配置中可选。

type:注册的源类型

mapto:注册的目标类型

lifetime:设置注册类型的生命周期

此外,还有instances元素,包括name,type,value,typeConverter四个属性。value表示注册实例的初始值,typeConverter是用以转换提供的值到实例的匹配类型的类型转换器。

具体的元素含义,可以参考Unity的帮助文档。

下面我们还是采用Monitor的例子,来实现用配置文件注册类型,配置文件示例:

   1:  <?xml version="1.0" encoding="utf-8" ?>
   2:  <configuration>
   3:    <configSections>
   4:      <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
   5:    </configSections>
   6:  
   7:    <unity>
   8:      <containers>
   9:        <container>
  10:          <types>
  11:            <type type="UnityDemo.IMonitor,UnityDemo" mapTo="UnityDemo.Monitor,UnityDemo" />
  12:            <type type="UnityDemo.INotify,UnityDemo" mapTo="UnityDemo.EmailNotify,UnityDemo" />
  13:          </types>
  14:        </container>
  15:      </containers>
  16:    </unity>
  17:  
  18:  </configuration>

程序代码修改如下:

   1:  using System;
   2:  
   3:  using Microsoft.Practices.Unity;
   4:  using Microsoft.Practices.Unity.Configuration;
   5:  using System.Configuration;
   6:  
   7:  namespace UnityDemo
   8:  {
   9:      class Program
  10:      {
  11:          static void Main(string[] args)
  12:          {
  13:              IUnityContainer container = new UnityContainer();
  14:              UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
  15:              section.Containers.Default.Configure(container);
  16:  
  17:              IMonitor monitor = container.Resolve<IMonitor>();
  18:              monitor.Alarm();
  19:  
  20:              Console.ReadLine();
  21:          }
  22:      }
  23:  }

编译运行结果:

使用配置文件,还有许多方便的地方,比如对于程序的扩展而言,新增的模块不再需要修改已编译好的程序,而只需要修改配置文件就可以方便的实现新模块的注册,对于系统的稳定性和可维护性都非常有好处。

得到指定文件的信息

107 views 十二月 26, 04 by Timothy

char* szFileName = “C:\\EnochShen.exe”;
DWORD dwSize = GetFileVersionInfoSize(szFileName,NULL);
LPVOID pBlock = malloc(dwSize);
GetFileVersionInfo(szFileName,0,dwSize,pBlock);

char* pVerValue = NULL;
UINT nSize = 0;
VerQueryValue(pBlock,TEXT(“\\VarFileInfo\\Translation”),
(LPVOID*)&pVerValue,&nSize);

CString strSubBlock,strTranslation,strTemp;
strTemp.Format(“000%x”,*((unsigned short int *)pVerValue));
strTranslation = strTemp.Right(4);
strTemp.Format(“000%x”,*((unsigned short int *)&pVerValue[2]));
strTranslation += strTemp.Right(4);
//080404b0为中文,040904E4为英文

//文件描述
strSubBlock.Format(“\\StringFileInfo\\%s\\FileDescription”,strTranslation);
VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(“文件描述: %s”,pVerValue);
AfxMessageBox(strTemp);

//内部名称
strSubBlock.Format(“\\StringFileInfo\\%s\\InternalName”,strTranslation);
VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(“文件描述: %s”,pVerValue);
AfxMessageBox(strTemp);

//合法版权
strSubBlock.Format(“\\StringFileInfo\\%s\\LegalTradeMarks”,strTranslation);
VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(“合法版权: %s”,pVerValue);
AfxMessageBox(strTemp);

//原始文件名
strSubBlock.Format(“\\StringFileInfo\\%s\\OriginalFileName”,strTranslation);
VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(“原始文件名: %s”,pVerValue);
AfxMessageBox(strTemp);

//产品名称
strSubBlock.Format(“\\StringFileInfo\\%s\\ProductName”,strTranslation);
VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(“产品名称: %s”,pVerValue);
AfxMessageBox(strTemp);

//产品版本
strSubBlock.Format(“\\StringFileInfo\\%s\\ProductVersion”,strTranslation);
VerQueryValue(pBlock,strSubBlock.GetBufferSetLength(256),(LPVOID*)&pVerValue,&nSize);
strSubBlock.ReleaseBuffer();
strTemp.Format(“产品版本: %s”,pVerValue);
AfxMessageBox(strTemp);

free(pBlock);

判断是否为文件夹或者文件

145 views 十一月 29, 04 by Timothy

int IsDirectoryOrFile(CString strFileName)
{
strFileName.TrimLeft();
strFileName.TrimRight();

WIN32_FIND_DATA fd;
HANDLE hFind = ::FindFirstFile(strFileName,&fd);
::FindClose(hFind);

//不存在同名的文件或文件夹
if (hFind == INVALID_HANDLE_VALUE)
{
return 0 ;
}
//判断是否为目录
else if (fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
return 2 ;
}
else//判断为文件
{
return 1;
}
}

从文件装载图象

89 views 十月 26, 04 by Timothy

*******************************************************************
* 这是从文件里装放位图
*
*******************************************************************/
BOOL CXxxView::OnDraw(CDC* pDC)
{
HBITMAP bitmap,OldBitmap;
bitmap = (HBITMAP)LoadImage(NULL,”xxx.bmp”,IMAGE_BITMAP,
0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
OldBitmap=(HBITMAP)MemDC.SelectObject(bitmap);
pDC->BitBlt(0,0,400,300,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(OldBitmap);
return TRUE;
}