怎么查看C#语言的版本

怎么查看C#语言的版本,第1张

在C#中有多种使用资源文件的方法,能够很方便地开发全球通用的应用程序。本文通过一个简单的小例子,来讲解在C#中如何利用资源文件,快速开发一个多种语言版本的程序。本例中只有一个窗体,三个控件,能够根据用户的设置以中文或英文界面运行。开发环境是Windows 2000 Professional、Microsoft Visual StudioNET 2002。具体开发步骤如下:

一、新建项目 启动Microsoft Visual Studio NET,新建一个C#项目MyApp,本例工程存放于F:\Csharp\MyApp。

二、添加控件 在Form1 窗体上添加三个控件(见图1):主菜单MainMenu、标签Label1和按钮Button1。Label1和Button1控件的属性均采用缺省设置。MainMenu控件中添加三个菜单项menuItem1、menuItem2、menuItem3。Text属性分别设为“语言”、“中文”和“English”。menuItem2、

menuItem3 的RadioCheck属性设为True。

图1 三、创建配置文件

在项目中添加一个文本文件MyAppConfigini,保存当前程序的语言版本设置。该文件中只有一行内容。如果是“English”,则表示程序为英文版;如果是“Chinese”则为中文版。这里暂且保存为“English”。

四、创建资源文件 NET中的资源文件有三种: 文本(txt )文件、XML 格式的Resx 文件和Resources 文件。文本文件只能包含形如“ 名称= 值”格式的字符串资源。Resx文件和Resources 文件中不仅能保存字符串资源,还能保存图像等可序列化的持久对象资源。但是只有resources 文件格式的资源文件才能被嵌入到运行库可执行文件中,或被编译为附属程序集。利用Visual Studio NET 中自带的资源文件生成器

(Resgenexe),可以将txt文件和Resx文件转换为resources 文件格式。本例中只用到了字符串资源,所以在项目中添加两个文本文件Resource_zhtxt 和Reource_entxt。

Reource_entxt 文件中的内容:

menuItem1_Name=Language

button1_Name=Exit

label1_Text=This is English version! Resource_zhtxt 文件中的内容:

menuItem1_Name=语言

button1_Name=退出

label1_Text=这是中文版! 需要注意的是Resource_zhtxt文件中含有汉字,必须以UTF-8编码保存。在Visual Studio NET集成开发环境中,可以先点击“文件”菜单中的“高级保存选项”,选中UTF-8编码格式,再保存文件。

然后,点击“程序”菜单中的“Visual Studio NET命令提示”菜单,进入DOS方式,输入以下两行命令,生成程序中能够访问的资源文件MyAppresources和MyAppzh-CNresources。英文资源文件MyAppresources 作为默认的后备资源文件。MyAppzh-CNresources

是中文资源文件,文件名中的“MyApp”是资源文件的根名称,必须与后备资源文件的根名称相同,“zh-CN”指定资源文件的区域性。

本文参考 Visual Studio各版本工程文件之间的转换 和 使用vs2013打开vs2015的工程文件的解决方案 两篇博文作了一定整理,本文中打开的工程文件为vs2013工程。

修改工程文件下后缀为 sln 的文件

将图中红色框选的位置改为需要的vs版本,不同vs版本的对应关系如下:

修改工程文件下后缀为 vcxproj 的文件

将 ToolsVersion 修改为需要的版本,不同vs版本的对应关系如下:

将 PlatformToolset 修改为需要的版本,不同vs版本的对应关系如下:

如果你只是想使用 CModuleVersion,那么看到这里就可以打住了;如果你想要了解 CModuleVersion 的工作原理,那就继续往下看。 假设CModuleVersion::GetFileVersionInfo 能加载模块并获取 HINSTANCE,它调用 ::GetFileVersionInfoSize 来获取版本信息的大小,然后分配一个缓冲并调用 GetFileVersionInfo 来填充该缓冲。原始缓冲(CModuleVersion::m_pVersionInfo)是一个数据块,它包含固定的信息和可变信息。VerQueryValue 将一个指针指向你感兴趣的特定信息的起始位置。例如,为了得到固定的信息(VS_FIXEDFILEINFO),你得这样写:LPVOID lpvi; UINT iLen; VerQueryValue(buf, _T(""), &lpvi, &iLen); 此处buf 是从 GetFileVersionInfo 返回的完整信息。字符串“”(在 C 中用“”),你如果把它看作是一个目录,那它就是根信息(有一点像注册表)。VerQueryValue 将 lpvi 置到 VS_FIXEDFILEINFO 的起始处,iLen 为其长度。 以上是获取固定信息的方法,可变信息获取更奇怪,因为你必须首先知道语言 ID 和代码页是什么。在 Winidows 里,代码页指定了一个字符集,它是字符文字与表示它们的 1 或 2 字节值之间映射。标准的 ANSI 代码页是 1252;Unicode 是 1200。Figure 7 是语言ID和代码页的清单。Figure 4 中文件信息里的 Translation 键指定模块的语言ID和代码页。在 CModuleVersion 中,我使用自己的 Translation 结构来获取这个信息。// in CModuleVersion struct TRANSLATION { WORD langID // language ID WORD charset; // code page } m_translation; 为了获取语言信息,CModuleVersion 用 VerQueryValue 函数以 VarFileInfoTranslation 作为键。if (VerQueryValue(m_pVersionInfo,"VarFileInfoTranslation", &lpvi, &iLen) && iLen >= 4) { m_translation = (TRANSLATION)lpvi; } 一旦你知道了语言ID和代码页,你就可以得到 CompanyName 和 InternalName 这样的可变信息。实现方法是构造一个如下形式的查询:StringFileInfo<langID><codepage><keyname> 这里<langID> 是十六进制 ASCI 形式的语言ID(中文是 0804;US English 是 0409),<codepage> 是代码页,格式为(1252 即 ANSI 的代码页是04e4),<keyname> 是你想要的键,如:CompanyName。为了构造这个查询,你得用 sprintf 或者 CString::Format 来构造字符串:StringFileInfo 40904e4CompanyName 然后将这个字符串传给 VerQueryValue。如果你对这些繁琐的细节感到晕菜,不用担心——很幸运,CModuleVersion::GetValue 对所有邋遢细节都进行了封装,所以你只要像下面这样写即可:CString s = verGetValue(_T("CompanyName")); 实现了 CModuleVersion,VersionDlg 就简单多了。 它实际上就是一个对话框,这个对话框带有一个编辑框,用于输入模块名称,每当用户在编辑框中敲入模块名称时,MFC 便调用 ON_EN_CHANGE 消息处理例程 CVersionDialog::OnChangedModule。OnChangedModule 例程通过 CModuleVersion 对象及其 GetFileVersionInfo 和 GetDllVersion 函数来获得版本信息,然后将信息显示在对话框的两个静态文本控件中。这个过程很简单。 最后还有个技巧我得提一下。GetFileVersionInfo,VerQueryValue 以及其它有关文件版本函数在一个叫做 versionlib 的库中,你必须将它链接到你程序中。从而避免链接时出现烦人的“undefined symbol”(未定义符号)错误,ModuleVerh 使用了一个鲜为人知但特别有用的 #pragma comment 语法,即使你忘记在 Project|Settings 的 Link 属性页中添加 Input ==〉Libraries 也没关系,#pragma comment 会告诉链接器与 versionlib 链接。// 告诉链接器与 versionlib 进行链接 #pragma comment(linker, "/defaultlib:versionlib") 现在,有人可能会问,为什么这些东西如此重要?以及谁会需要这些东西呢?一般来说,如果你编写的是显示文件属性之类的工具程序,那你只是需要获取诸如 CompanyName 和 LegalCopyright 之类的变量。但你也许发现用 CModuleVersion 从自己的应用程序中吸取文件信息很有用,例如,为了在“关于”对话框和启动屏幕中显示版本信息。如果你使用 CModuleVersion,你只需修改资源文件中相应位置的版本信息即可,“关于”对话框和启动屏幕会自动显示当前最新版本信息。 版本信息另一个重要的用途是确定某个DLL是针对哪种语言编写的,这样你代码能与之对应。随着当今基于 Windows 的编程技术迅猛发展,DLLs 的新版本也随之日新月异,你很快就会发现下面这样的代码越来越多:if (version <= 470) // do one thing else if (version==471) // do something else else if (version==472) // do a third thing else // scream 这是一件很郁闷的事情,我敢说这也是微软的大佬们引入 DllGetVersion 来快速获取版本号的一个原因,从而避免了面对让人恐惧的 GetFileVersionInfo 函数,只用它来获取语言 IDs 和代码页(仅在需要获取诸如 CompanyName 这样的信息时使用)。 comctl32dll 的与众不同也没有什么意外的,这个模块版本问题已经程序员最大的祸害之一,我可怜的邮箱曾被读者关于 comctl32dll 这个模块的问题撑爆,很多问题都是客户下载了微软最新版本的 comctl32dll 到机器上之后,应用程序就无法运行了。我会在以后的文章中解释 comctl32dll 的版本问题,以及新的 toolbar 特性,如何解决 MFC 中 CToolBar 的 bug。现在,由于篇幅所限,我只能点到为止,目前 comctl32dll 最新的版本为 600(随 IE 一起发布)。 最后,感谢上帝,微软已经出台关于可以随你的应用程序一起分发 comctl32dll!但不是单独分发 comctl32dll,而是可以随你程序的更新包及其它文件一起分发。

如果你的vs2017不兼容sqlserver版本,你可以尝试以下方法:

1 升级sqlserver版本,如果你的sqlserver版本过低,可以根据vs2017的要求升级到较新版本;

2 下载并安装vs2017的补丁,这样可以解决一些兼容性问题;

3 如果你正在使用sql server 2016 express edition,可以将它升级到sql server 2017,这样可以解决兼容性问题。

4 如果你要开发sql server 2012 / 2014报表,可以下载安装sql server 2012 / 2014 Report Builder,这样可以解决兼容性问题。

以上就是关于怎么查看C#语言的版本全部的内容,包括:怎么查看C#语言的版本、使用低版本vs软件打开高版本vs工程、如何获取某个动态链接库的版本信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9699399.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存