因为另有开发记录工具最新没怎么在 cnblog 写开发备忘.不过我觉得这个是个比较严重的问题,觉得有必要让更多的人知道处理方法,所以在 cnblog 也放上一篇希望广为传播.

因为现在网络上vs2008能直接使用的版本很难找,所以放一个修改自 sourceforge 能用的版本,并且说明修改的方式.

--------------------------------------------------

第一次修改

--------------------------------------------------

NVelocity 这个工具的使用相信大多数网友都是因为和我一样在 java 时使用的是 Velocity ,因此在使用 C# 特别希望有一个类似的工具包.而搜索得到的就是 NVelocity.

NVelocity 两三年前我是用过的,所以并不觉得这次用会有什么问题. 照例在网上搜索后加入工程及网上的各种示例就点运行.为料出现了 "It appears that no class was specified as the ResourceManager..." ,心里也并不慌张,因为根据经验估计也就是某个 dll 引用没弄进来. 结果折腾了各种文件和网上的各种例子就是不对. 不知不觉一个上午就过去了,觉得事情有点严重,放下大意的心情,打开了我以前的工程.发现有几个不同的地方:
1.之前公司用的是 vs2010 , 现在用的是 vs2008,没办法直接编译.

2.之前工程中只有一个 NVelocity.dll 文件,也没有源码,而这次下载的却有 NVelocity.dll,NVelocity.http.dll 及源码等多个文件.

好吧,我把这个 NVelocity.dll 替换好了.但编译时即报错,查看了文件的版本信息,其写明了是 for .net 4.0 的,当然这时直接换用 vs2010 就好了.不过我的情况稍微特殊,生产环境是 .net 2.0 的,不是太方便让人升级,再说升级 .net 环境有时候会成为灾难 -- 我以前升级 .net 3.5 时碰到过很多次,虽然 .net 4.0 好很多.实在不想节外生枝.

好吧,又在网上搜索了无数的类似问题.都不行.期间看到说因为 NVelocity 交由了什么 xxx 维护了,所以 NVelocity 的源码版本有多个. 这时意外在某网友的例子中发现了能用的 .net 2.0 版本 NVelocity.dll 但其文件没有版本信息,显然不是官方的,但这位网友的文章显示是多次转载已经找不到其如何修改的信息了.我下载的文件位于(NVelocity-0.4.2.8580):

http://nvelocity.sourceforge.net/

因为这是 google 搜索的第一个,而 baidu 搜索的第一个就是那个 for .net 4.0 版本的:

http://nvelocity.codeplex.com/

而网友那个可用的 .net 2.0 版本已经没有下载地址了.说实话我理解不了 sourceforge.net  这个为什么用不了,这么有名的控件在这么有名的网站上提供的文件居然是错误的.通过我搜索的其他信息,相应的 bug 应当是有人提交了的,不知为什么没有提交到 sourceforge.net 这里.

好了,不管那么多,至少在我的中文版本 vs2008 上需要修改以下部分才能正常使用:

文件 ResourceLocator.cs 中

try
            {//clq
                foreach (Assembly a in assemblies)
                {
                    String prefix = a.FullName.Substring(0, a.FullName.IndexOf(",")).ToLower();
                    String[] names = a.GetManifestResourceNames();
                    try
                    {//clq //这里都没错,应当是前面的两句话造成的
                    foreach (String s in names)
                    {

if (s.ToLower().Equals(fn) || s.ToLower().Equals(prefix + "." + fn))
                        {
                            this.filename = s;
                            assembly = a;
                            isResource = true;
                        }
                    }
                    }
                    catch (System.Exception ex)
                    {
                        String s = ex.Message;
                        System.Console.WriteLine("bbbbbb:" + s);
                    }//clq
                }
            }catch(System.Exception ex)
            {
                String s = ex.Message;
                System.Console.WriteLine("aaaaaa:" + s);
            }//clq
            
        }//if clq

根据我的测试大概的出错原因是,某个资源文件在反射机制搜索时不支持某个接口,导致其异常退出了剩余资源的处理.所以直接加几个 try 就行了(ps:反射实现,恐怕效率不高吧).

这样修正后下面这样的代码就可以通过运行了.

VelocityEngine vltEngine = new VelocityEngine();
            //4.0 这里是 RuntimeConstants.RESOURCE_LOADER
            vltEngine.SetProperty(RuntimeConstants_Fields.RESOURCE_LOADER, "file");
            string path = _this.Server.MapPath("~/");
            vltEngine.SetProperty(RuntimeConstants_Fields.FILE_RESOURCE_LOADER_PATH, path);
            vltEngine.Init();//不修改库代码,这里会报错

--------------------------------------------------

第二处修改

--------------------------------------------------

以上修改后使用一段时间后,因为我个人的工具链中很多是不支持 utf8 的(或者很麻烦),在此将模板改为了普通的 gbk 编码方式.这时发现这个版本没法纠正编码形式.我修改了一个地方才行.正常的编码纠正代码为:

vltEngine.SetProperty(RuntimeConstants_Fields.OUTPUT_ENCODING, "GB2312");//修改 NVelocity-0.4.2.8580 的源码后才能用这两个,并且最好是用 GBK
            vltEngine.SetProperty(RuntimeConstants_Fields.INPUT_ENCODING, "GB2312");//

在此版本 nvelocity 中不起作用,需要修改:

Template.cs 文件中

//System.IO.StreamReader br = new System.IO.StreamReader(new System.IO.StreamReader(is_Renamed, System.Text.Encoding.GetEncoding(encoding)).BaseStream);
            System.IO.StreamReader br = new System.IO.StreamReader(new System.IO.StreamReader(is_Renamed, System.Text.Encoding.GetEncoding(encoding)).BaseStream, System.Text.Encoding.GetEncoding(encoding));//clq 2014.05.23

很显然作者可能是老外,编码指定的位置弄错了.

--------------------------------------------------

为方便大家参考,我放上修改后的全部项目文件,这里用的是 debug 版本,对效率有要求的环境请自动编译其他版本.代码修改的地方不多,大家可全文搜索 "//clq" 字样就能找到,其他代码因为本人水平有限也看不懂也不敢乱改.出于稳定和不想惹麻烦的原因未来也不打算大改,能在我目前这个小项目中用就行.

下载地址为:

http://files.cnblogs.com/-clq/NVelocity-0.4.2.8580%5B2014.05.23%5D%5Bclq_modify%5D.zip

--------------------------------------------------

如果还有其他 bug 我会再上传新版本.另外也希望有了解内情的网友介绍下 nvelocity 如此混乱的原因.

NVelocity-0.4.2.8580 的修改记录[发个vs2008能用的版本] -- "It appears that no class was specified as the ResourceManager..." bug 修正等的更多相关文章

  1. .NET 5.0 RC1 发布,离正式版发布仅剩两个版本

    原文:http://dwz.win/Qf8 作者:Richard 翻译:精致码农-王亮 说明:1. 本译文并不是完全逐句翻译的,存在部分语句我实在不知道如何翻译或组织就根据个人理解用自己的话表述了.2 ...

  2. Activiti6.0 工作流引擎 websocket即时聊天发图片文字 好友群组 SSM源码

    即时通讯:支持好友,群组,发图片.文件,消息声音提醒,离线消息,保留聊天记录 (即时聊天功能支持手机端,详情下面有截图) 工作流模块---------------------------------- ...

  3. Python 0基础开发游戏:打地鼠(详细教程)VS code版本

    如果你没有任何编程经验,而且想尝试一下学习编程开发,这个系列教程一定适合你,它将带你学习最基本的Python语法,并让你掌握小游戏的开发技巧.你所需要的,就是付出一些时间和耐心来尝试这些代码和操作. ...

  4. Windows 8系统默认开启的.Net Framework版本是4.0,而部分用户可能需要使用到3.5或以下版本,简单添加方法

    从网络途径下载的.Net Framework3.5是无法直接在Windows 8系统上安装的,我们可以通过Windows 8的添加功能来实现 1.打开控制面板,点击”启用或关闭Windows 功能“ ...

  5. python3-开发进阶 django-rest framework 中的 版本操作(看源码解说)

    今天我们来说一说rest framework 中的 版本 操作的详解 首先我们先回顾一下 rest framework的流程: 请求进来走view ,然后view调用视图的dispath函数 为了演示 ...

  6. Git-Git分支

    代码管理之殇 分支是代码管理的利器.如果没有有效的分支管理,代码管理就适应不了复杂的开发过程和项目的需要.在实际的项目实践中,单一分支的单线开发模式还远远不够,因为: 成功的软件项目大多要经过多个开发 ...

  7. 初探内核之《Linux内核设计与实现》笔记上

    内核简介  本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核   原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单.2. 高效 ...

  8. AEAI HR开源人力资源管理v1.6.0发版公告

    1 升级说明 AEAI HR v1.6.0版是AEAI HR v1.5.2版人力资源管理系统的升级版本,本次升级的系统是基于AEAI DP 3.8.0_20170228进行打包部署的,升级内容主要是针 ...

  9. AS负责人说不必用Kotlin重写,但OkHttp拿Kotlin重写了一遍,就发了OkHttp 4.0!

    虽然 Android Studio 的负责人 Jeffery 已经澄清,只是 Kotlin-First 而不是 Kotlin-Must,并不需要将 App 用 Kotlin 重写一遍.但是 OkHtt ...

随机推荐

  1. javascript中闭包的概念

    这个是每个前端工程师绕不开的一个问题,网上各种资料很多,整个春节,我仔细研读了红皮经典中关于这一块的注释,加深了对这一块的理解. 有好几个概念需要重申一下.以下都是我的理解: 1. 闭包是javasc ...

  2. 基于OpenCv的人脸检测、识别系统学习制作笔记之一

    基于OpenCv从视频文件到摄像头的人脸检测 在OpenCv中读取视频文件和读取摄像头的的视频流然后在放在一个窗口中显示结果其实是类似的一个实现过程. 先创建一个指向CvCapture结构的指针 Cv ...

  3. [转]Flash Socket通信的安全策略

    昨天做测试的时候遇到一个问题,做好的SWF在Flash AS3中调试通过,但是发布到html中之后就无法得到数据了.查了一些资料之后找到了解决办法.这里感谢 剑心 提供帮助,以及同事若水三千提供Jav ...

  4. sql把一个表数据插入到另一张表

    把一个表数据插入到另一张表 insert into tableB (field1,field2,field3,field4) select field1,field2,field3,'val4' fr ...

  5. entlib验证组件

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. WPF ToolKit Chart 自定义样式

    1.引用:WPFToolkit.dll, System.Windows.Controls.DataVisualization.Toolkit.dll 2. 页面代码参考如下: <UserCont ...

  7. C# 截取字符串方法(包含中英混合)

    private string GetByteString(string center, int maxlen, string endStr) { , (center.Length < maxle ...

  8. Lambda表达式的前世今生

    Lambda 表达式 早在 C# 1.0 时,C#中就引入了委托(delegate)类型的概念.通过使用这个类型,我们可以将函数作为参数进行传递.在某种意义上,委托可理解为一种托管的强类型的函数指针. ...

  9. [OpenGL] 1、环境搭建及最小系统

    >_<: 首先推荐一个企业版的VC6.0自带OpenGL和DirectX,非常方便:http://pan.baidu.com/s/1mgIAGi8 PS: 要注意这里的OpenGL建立的工 ...

  10. thrift之TTransport层的分帧传输类TFramedTransport

    帧传输类就是按照一帧的固定大小来传输数据,所有的写操作首先都是在内存中完成的直到调用了flush操作,然后传输节点在flush操作之后将所有数据根据数据的有效载荷写入数据的长度的二进制块发送出去,允许 ...