因为另有开发记录工具最新没怎么在 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. 解决VS2010链接错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    网上有多种解决办法,我用最懒的一种,系统是Win7 X86,方法如下: C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe C:\Prog ...

  2. 过滤器(servlet.filter)和拦截器(springmvc.interceptor)区别

    ①拦截器是基于java的反射机制的,而过滤器是基于函数回调. ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器. ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求 ...

  3. Dapper试用

    以下代码摘自imfunny的<给力分享新的ORM => Dapper> http://www.cnblogs.com/imfunny/archive/2011/09/16/21788 ...

  4. poj 1325 Machine Schedule

    Time Limit: 1000 MS Memory Limit: 10000 KB 64-bit integer IO format: %I64d , %I64u   Java class name ...

  5. jquery给input域赋值和取值

    参考: http://blog.csdn.net/happymagic/article/details/8707117

  6. SQLSERVER 2012之AlwaysOn -- 一次硬件升级引发的问题

    这是上周遇到的一个案例:对已有的硬件进行升级而引发的问题,期间还触发了一个比较严重的BUG,可谓多灾多难:不过值得庆幸的是,在一连串连锁问题出现的时候,并没有出现人工操作失误(这往往是在处理故障中风险 ...

  7. 腾讯DBA官方博客开通了,欢迎交流

    腾讯DBA官方博客开通了,欢迎交流哈..麻烦给放到首页一下     http://tencentdba.com   腾讯互娱游戏DBA团队一直致力于为游戏提供稳定.高效的DB运营服务,这是我们团队的使 ...

  8. Xamarin开发Android笔记:图片切换ImageSwitcher

    在移动应用开发过程中经常会使用到图片展示场景,例如利用多张图片说明一个产品的特点,此处就会使用到ImageSwithcher,当然也可以使用ViewFliper来实现,但使用ViewFliper的时候 ...

  9. Dynamic CRM 2013学习笔记(二十八)用JS动态设置字段的change事件、必填、禁用以及可见

    我们知道通过界面设置字段的change事件,是否是必填,是否可见非常容易.但有时我们需要动态地根据某些条件来设置,这时有需要通过js来动态地控制了. 下面分别介绍如何用js来动态设置.   一.动态设 ...

  10. ASP.NET 5中的静态文件处理

    ASP.NET 5 与之前的 ASP.NET 相比,有着翻天覆地的变化.了解与熟悉它需要一个过程,而我选择的了解方式是一步一步从无而有手写一个简单的 ASP.NET 5 程序,然后根据遇到的问题进行学 ...