在简体中文XP下构建SSCLI 2.0的注意点

本文记录了作者在简体中文环境下使用Visual Studio 2008编译SSCLI2.0过程中遇到的各种问题及解决方案,包括环境变量配置、正则表达式调整、非ASCII字符处理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个产品给end user的时候需要注重用户体验,一份源代码给程序员的时候也要注重一下用户体验啊 T T
真的能做到out-of-the-box exprience的源代码真是够少的。不过也正是这样才能磨炼出高手?之前要用VS2008编译boost已经快搞死我了。这两天要用一下Rotor也是,心里一直在念叨要是自己机上装的系统是英文版的Windows XP和Visual Studio 2005就好了。
T T

之前Jeremy Kuhne也提到了[url=http://blogs.msdn.com/jeremykuhne/archive/2008/02/19/sscli-2-0-and-visual-studio-2008.aspx]如何应对Visual Studio 2008来调整SSCLI 2.0的代码[/url],但是要在简体中文Windows XP下光是使用他所做的修改还不足够。

首先,Jeremy似乎漏说了一点:他在\sscli20\win.env.bat里添加的这句:
[code]if "%ROTOR_WINSDKDIR%"=="" set ROTOR_WINSDKDIR=%WindowsSdkDir%[/code]
在系统没有设置这个环境变量的时候是起不到作用的。然而VC9里又没有PlatformSDK目录,这个配置就会失败……
于是,在环境变量里设置WindowsSdkDir,值为C:\Program Files\Microsoft SDKs\Windows\v6.0A
(或者机器上Windows SDK的实际安装位置,例如说装了Windows SDK 6.1的话路径会不同)

另外,还是在\sscli20\win.env.bat,我遇到了个奇怪的问题,在这行:
[code]set /A ROTOR_TOOLSET_VERSION=%ROTOR_TOOLSET_VERSION%/10-60[/code]
会报错说“找不到操作数”。无法理解嗯。于是干脆把整个toolset detection都REM掉了,直接换上一句:
[code]set ROTOR_TOOLSET_VERSION=90[/code]
OTL。

接下来,在\sscli20\env.core.pl里,这行:
[code]if (! ($platform_os_version =~ s/\nMicrosoft.*\[Version +([0-9]+\.[0-9]+)\..*\]/$1/g)) {[/code]
糟糕的是,我这简体中文的XP在输入ver命令的时候得到的是这样的结果:
[code]Microsoft Windows XP [版本 5.1.2600][/code]
没有那个"Version",于是这个正则表达式会匹配失败。
解决的办法是把"Version"换成“版本”:
[code]if (! ($platform_os_version =~ s/\nMicrosoft.*\[版本 +([0-9]+\.[0-9]+)\..*\]/$1/g)) {[/code]

============================================================================

\sscli20\clr\vm\thread.cpp
这个文件里似乎有好几个超过0x80的字符。太奇怪了吧这个……难道是UTF-8的?但是没有UTF-8的BOM。反正我在error里看到这个了:
[quote]vm\threads.cpp : error C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss[/quote]

同样的问题也发生在了\sscli20\clr\vm\win32threadpool.cpp
[quote]vm\win32threadpool.cpp(2582) : error C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss[/quote]

实在受不了了,写了个简单的C#程序来检测是不是有非ASCII字符在代码中出现:
cp.cs:
using System;
using System.IO;

sealed class CP {
static void Main( string[ ] args ) {
int lineno = 1;
using ( FileStream fs = File.OpenRead( args[0] ) ) {
while ( fs.CanRead ) {
int b = fs.ReadByte();
if ( b < 0 ) break;
else if ( b == 0x0A ) ++lineno;
else if ( b > 0x080 ) {
Console.WriteLine( "Line {0}: 0x{1:X}", lineno, b );
}
}
}
}
}

然后写个Perl或者Ruby脚本来看看输出结果就知道有没有文件出问题了……不过看到也就是这两个文件问题严重。改了这两个文件之后总算能build完了,虽然中间还是有些cannot find header file之类的错误。

===========================================================================

正好,拿上面的cp.cs来测试下刚build完的SSCLI 2.0的csc与clix:
[quote]H:\sscli20>csc cp.cs
Microsoft (R) Shared Source CLI C# Compiler version 2.0.0001
for Microsoft (R) Shared Source CLI version 2.0.0
Copyright (C) Microsoft Corporation. All rights reserved.


H:\sscli20>clix cp env.core.pl
Line 552: 0xB0
Line 552: 0xE6
Line 552: 0xB1
Line 552: 0xBE
Line 553: 0xB0
Line 553: 0xE6
Line 553: 0xB1
Line 553: 0xBE[/quote]
env.core.pl这两行就是我把Version改成“版本”并添加注释的地方。Good,暂时看来运行得还算正常。

接下来可以开始hack我要修改的那部分代码了……这逃逸计算的问题我就是想看看在实际的C#编译器里能不能运行起来……

===========================================================================

另外,这边[url=http://samgentile.com/blogs/samgentile/pages/a-night-with-rotor-and-rotor-resources.aspx]A Night With Rotor and Rotor Resources[/url]也有些相关的build问题。不过他遇到的问题我没遇到就是了……留着链接参考用。

更新:
在博客园看到一个链接帖,顺便记下来
[url=http://www.cnblogs.com/lbq1221119/archive/2008/11/12/1331912.html]Build SSCLI20 under VS2008 full Document (完全手册)[/url]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值