编译IronRuby项目和修复其中的一些bugs

本文介绍如何从源代码编译IronRuby预Alpha版本,并解决其中一个字符串连接导致的变量值改变的问题。文中详细记录了安装环境、编译步骤及bug修复过程。

编译:

1.下载了源代码,并且安装了.net framework

2.因为.net framework安装时的bug,所以一定要检查一下%frameworkdir%,%frameworkversion%这两个环境变量的位置,我直接修改的build.cmd文件,使用了msbuild的绝对位置:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\msbuild.exe /p:Configuration=Release /t:Rebuild IronRuby.sln

3.保存Build.cmd,在console下运行它,不出意外的话将成功编译。

测试一个bug:

1  a = " fanweixiao "
2  " fanweixiao "
3  b = "  维生素C.net "
4  "  维生素C.net "
5  c = a + b
6  " fanweixiao 维生素C.net "
7  a
8  " fanweixiao 维生素C.net "

大家可以看到变量a也变成a+b了

修复这个bug

找到Ruby\Builtins\MutableStrings.cs的Concatenate(MutableString self, MutableString other)方法:

很明显self.Append(other)会导致self自己发生改变,那么我们改写这个方法:

再次编译运行rbx.exe,已经被修复了。

其他:

正如大家看到的一样,这只是一个Pre-Alpha版本,有许许多多的细节还不完善,不过如果想将其尽快应用上,有些文章能派上用场:

FePy对math方面的修复和扩展

WPF Sample in IronRuby talking via C# to Wesabe

IronRuby with .Net 3.x and Windows Presentation Foundation (WPF)

<think>我们正在处理一个关于.NET WebFormsMVC混合项目中的路由问题。用户遇到了路由配置的问题,需要帮助解决。 参考信息: 引用[1]提到了ASP.NET MVC框架,以及使用NVelocity作为替代视图引擎。 引用[2]提到了使用WebMvcTest注解来单元测试Spring MVC应用,但这是Java Spring的内容,与.NET无关,可能不直接相关。 引用[3]提到了自定义库的插入,例如自定义捆绑转换(如LESS转换),这展示了ASP.NET中的可扩展性,但并非直接关于路由。 引用[4]提到了Ruby on Rails框架,以及使用IronRuby在.NET中运行Rails,与当前问题无关。 引用[5]提到了声明(claims)的请求需求,与安全相关,与路由问题无关。 因此,主要参考引用[1]中关于ASP.NET MVC框架的内容,以及引用[3]中关于自定义扩展的内容(虽然不直接相关,但展示了ASP.NET的可扩展性)。 问题分析: 在混合使用WebFormsMVC的项目中,路由问题通常是由于两种技术使用不同的处理机制导致的。WebForms依赖于物理文件路径(如.aspx文件),而MVC使用路由系统将URL映射到控制器动作方法。 常见问题: 1. 路由配置可能被WebForms请求干扰,反之亦然。 2. 当同时存在WebForms页面MVC控制器时,如何确保正确的请求被路由到正确的处理程序。 解决方案: 1. 确保在Global.asax(对于.NET Framework)或Startup.cs(对于.NET Core)中正确配置路由。 2. 使用`IgnoreRoute`忽略WebForms页面的路径,防止MVC路由系统尝试处理这些请求。 3. 为WebForms页面配置路由(如果需要)可以使用`MapPageRoute`方法。 具体步骤: 对于ASP.NET MVC 5(.NET Framework): 在`Application_Start`方法中配置路由。 示例代码: ```csharp public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { // 其他配置... RegisterRoutes(RouteTable.Routes); } public static void RegisterRoutes(RouteCollection routes) { // 忽略对WebForms页面的资源请求(如图片、CSS等)具体的aspx页面 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute("SomeFolder/SomePage.aspx"); // 为WebForms页面添加路由(可选) routes.MapPageRoute("webform-route", "somepath", "~/SomeFolder/SomePage.aspx"); // 配置MVC路由 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } ``` 对于ASP.NET Core,由于WebForms并不是官方支持的,混合使用较为复杂,但如果有类似需求(比如迁移过程中),可以使用端点路由: 在Startup.cs的Configure方法中: ```csharp app.UseEndpoints(endpoints => { // 为WebForms页面配置路由(假设使用了一个中间件来处理WebForms请求) // 注意:ASP.NET Core默认不支持WebForms,需要第三方库 // MVC路由 endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); ``` 注意事项: - 如果WebForms页面MVC控制器有相同的URL模式,那么路由的先后顺序很重要,先注册的路由会先被匹配。 - 使用`IgnoreRoute`可以避免MVC路由系统处理特定的URL。 另外,如果用户遇到特定问题,如某个WebForms页面被MVC路由捕获,或者反过来,需要检查路由配置的顺序忽略规则。 生成相关问题: 1. 如何配置路由以忽略特定的WebForms页面? 2. 在混合项目中,如何处理WebForms页面的路由? 3. ASP.NET Core是否支持WebForms?如果不支持,如何迁移? 4. 如何确保MVC路由WebForms页面不冲突? 5. 在混合项目中,如何实现URL重写? 根据用户的问题,我们主要关注.NET Framework下的混合项目。 因此,回答将集中在.NET Framework的解决方案上。</think>### .NET WebForms与MVC混合项目的路由问题解决方案 在混合使用WebFormsMVC的项目中,路由冲突是常见问题,主要源于两套不同的URL处理机制。以下是系统化的解决方案: #### 1. **路由配置优先级(关键步骤)** ```csharp // Global.asax.cs protected void Application_Start() { // 先注册WebForms路由 RouteTable.Routes.MapPageRoute( "WebFormRoute", "legacy/{page}", "~/LegacyPages/{page}.aspx" ); // 再注册MVC路由 RouteConfig.RegisterRoutes(RouteTable.Routes); // MVC标准路由配置 } ``` **原理**:WebForms路由需优先注册,避免MVC路由捕获.aspx请求[^1]。通过`MapPageRoute`显式声明WebForms路径模板。 #### 2. **忽略规则配置** ```csharp // RouteConfig.cs (MVC路由配置文件) public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.aspx/{*pathInfo}"); // 忽略.aspx扩展 routes.IgnoreRoute("LegacyPages/{*path}"); // 忽略特定目录 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } ``` **作用**:防止MVC尝试处理WebForms请求,避免404错误[^3]。 #### 3. **处理路由冲突场景 - **场景1**:`/Home.aspx` 与 MVC的`HomeController`冲突 **方案**:在WebForms路由中配置唯一前缀(如`legacy/Home.aspx`) - **场景2**:静态文件被路由拦截 **方案**:添加忽略规则 ```csharp routes.IgnoreRoute("{*allstatic}", new { allstatic = @".*\.(css|js|png)(/.*)?" }); ``` #### 4. **高级场景:共享身份认证** 若需共享FormsAuthentication: ```xml <!-- web.config --> <system.web> <authentication mode="Forms"> <forms loginUrl="~/Account/Login" /> <!-- MVC登录页 --> </authentication> <authorization> <deny users="?"/> </authorization> </system.web> <location path="LegacyPages"> <system.web> <authorization> <allow users="*"/> <!-- WebForms页面单独授权 --> </authorization> </system.web> </location> ``` #### 5. **迁移辅助策略** ```csharp // 重定向旧WebForms URL到新MVC路由 routes.MapRoute( name: "RedirectOldPages", url: "oldpage.aspx", defaults: new { controller = "Redirect", action = "LegacyPage" } ); ``` 在`RedirectController`中实现301跳转逻辑,逐步迁移流量[^5]。 > **最佳实践**: > - 使用`RouteDebugger`包诊断路由优先级 > - 为WebForms路径添加统一前缀(如`/legacy/`) > - 避免在MVC控制器中使用`.aspx`同名动作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值