Skip to content

Commit

Permalink
Upgrade to JSPool 3.0 (#421)
Browse files Browse the repository at this point in the history
* Upgrade to JSPool 3.0

* Add assembly redirects to MSBuild

* Remove `ReturnEngineToPool` method from factory as it's no longer needed
  • Loading branch information
Daniel15 authored Jul 2, 2017
1 parent e1809a0 commit e6ce44a
Show file tree
Hide file tree
Showing 18 changed files with 142 additions and 76 deletions.
4 changes: 2 additions & 2 deletions build.proj
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ of patent rights can be found in the PATENTS file in the same directory.
<Project ToolsVersion="4.0" DefaultTargets="Build;Test;Package" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Major>3</Major>
<Minor>0</Minor>
<Build>1</Build>
<Minor>1</Minor>
<Build>0</Build>
<Revision>0</Revision>
<DevNuGetServer>http://reactjs.net/packages/</DevNuGetServer>
<MSBuildCommunityTasksPath>$(MSBuildProjectDirectory)\tools\MSBuildTasks</MSBuildCommunityTasksPath>
Expand Down
12 changes: 3 additions & 9 deletions src/React.Core/IJavaScriptEngineFactory.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System;
using JavaScriptEngineSwitcher.Core;
using JavaScriptEngineSwitcher.Core;
using JSPool;

namespace React
{
Expand All @@ -25,12 +25,6 @@ public interface IJavaScriptEngineFactory
/// Gets a JavaScript engine from the pool.
/// </summary>
/// <returns>The JavaScript engine</returns>
IJsEngine GetEngine();

/// <summary>
/// Returns an engine to the pool so it can be reused
/// </summary>
/// <param name="engine">Engine to return</param>
void ReturnEngineToPool(IJsEngine engine);
PooledJsEngine GetEngine();
}
}
16 changes: 1 addition & 15 deletions src/React.Core/JavaScriptEngineFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -223,26 +223,12 @@ public virtual void DisposeEngineForCurrentThread()
/// Gets a JavaScript engine from the pool.
/// </summary>
/// <returns>The JavaScript engine</returns>
public virtual IJsEngine GetEngine()
public virtual PooledJsEngine GetEngine()
{
EnsureValidState();
return _pool.GetEngine();
}

/// <summary>
/// Returns an engine to the pool so it can be reused
/// </summary>
/// <param name="engine">Engine to return</param>
public virtual void ReturnEngineToPool(IJsEngine engine)
{
// This could be called from ReactEnvironment.Dispose if that class is disposed after
// this class. Let's just ignore this if it's disposed.
if (!_disposed)
{
_pool.ReturnEngineToPool(engine);
}
}

/// <summary>
/// Gets a factory for the most appropriate JavaScript engine for the current environment.
/// The first functioning JavaScript engine with the lowest priority will be used.
Expand Down
12 changes: 6 additions & 6 deletions src/React.Core/React.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,16 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="JavaScriptEngineSwitcher.ChakraCore" Version="2.3.2" />
<PackageReference Include="JavaScriptEngineSwitcher.Core" Version="2.2.0" />
<PackageReference Include="JavaScriptEngineSwitcher.Msie" Version="2.3.2" />
<PackageReference Include="JSPool" Version="2.0.1" />
<PackageReference Include="MsieJavaScriptEngine" Version="2.1.2" />
<PackageReference Include="JavaScriptEngineSwitcher.ChakraCore" Version="2.4.8" />
<PackageReference Include="JavaScriptEngineSwitcher.Core" Version="2.4.9" />
<PackageReference Include="JavaScriptEngineSwitcher.Msie" Version="2.4.9" />
<PackageReference Include="JSPool" Version="3.0.1" />
<PackageReference Include="MsieJavaScriptEngine" Version="2.2.2" />
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net40' ">
<PackageReference Include="JavaScriptEngineSwitcher.V8" Version="2.2.0" />
<PackageReference Include="JavaScriptEngineSwitcher.V8" Version="2.4.2" />
<PackageReference Include="VroomJs" Version="1.2.3" />
<Reference Include="System.Runtime.Caching" />
<Reference Include="System" />
Expand Down
9 changes: 5 additions & 4 deletions src/React.Core/ReactEnvironment.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
using System.Threading;
using JavaScriptEngineSwitcher.Core;
using JavaScriptEngineSwitcher.Core.Helpers;
using JSPool;
using Newtonsoft.Json;
using React.Exceptions;

Expand Down Expand Up @@ -68,7 +69,7 @@ public class ReactEnvironment : IReactEnvironment, IDisposable
/// Contains an engine acquired from a pool of engines. Only used if
/// <see cref="IReactSiteConfiguration.ReuseJavaScriptEngines"/> is enabled.
/// </summary>
protected Lazy<IJsEngine> _engineFromPool;
protected Lazy<PooledJsEngine> _engineFromPool;

/// <summary>
/// List of all components instantiated in this environment
Expand Down Expand Up @@ -108,7 +109,7 @@ IFileCacheHash fileCacheHash
_babelTransformer = new Lazy<IBabel>(() =>
new Babel(this, _cache, _fileSystem, _fileCacheHash, _config)
);
_engineFromPool = new Lazy<IJsEngine>(() => _engineFactory.GetEngine());
_engineFromPool = new Lazy<PooledJsEngine>(() => _engineFactory.GetEngine());
}

/// <summary>
Expand Down Expand Up @@ -399,8 +400,8 @@ public void ReturnEngineToPool()
{
if (_engineFromPool.IsValueCreated)
{
_engineFactory.ReturnEngineToPool(_engineFromPool.Value);
_engineFromPool = new Lazy<IJsEngine>(() => _engineFactory.GetEngine());
_engineFromPool.Value.Dispose();
_engineFromPool = new Lazy<PooledJsEngine>(() => _engineFactory.GetEngine());
}
}

Expand Down
86 changes: 86 additions & 0 deletions src/React.MSBuild/AssemblyBindingRedirect.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* Copyright (c) 2017-Present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;

namespace React.MSBuild
{
/// <summary>
/// Hacks around the fact that it's not possible to do assembly binding redirects in MSBuild.
///
/// https://github.com/Microsoft/msbuild/issues/1309
/// http://blog.slaks.net/2013-12-25/redirecting-assembly-loads-at-runtime/
/// </summary>
public static class AssemblyBindingRedirect
{
/// <summary>
/// Redirects that have been configured
/// </summary>
private static readonly Dictionary<string, Version> _redirects = new Dictionary<string, Version>();

static AssemblyBindingRedirect()
{
// This is in a static constructor because it needs to run as early as possible
ConfigureRedirect("JavaScriptEngineSwitcher.Core");
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly;
}

/// <summary>
/// Enables assembly binding redirects
/// </summary>
public static void Enable()
{
// Intentionally empty. This is just meant to ensure the static constructor
// has run.
}

/// <summary>
/// Configures a redirect for the specified assembly. Redirects to the version in the bin directory.
/// </summary>
/// <param name="name">Name of the assembly to redirect</param>
private static void ConfigureRedirect(string name)
{
var currentAssemblyPath = Assembly.GetExecutingAssembly().Location;
var redirectAssemblyPath = Path.Combine(
Path.GetDirectoryName(currentAssemblyPath),
name + ".dll"
);

try
{
var realAssembly = Assembly.LoadFile(redirectAssemblyPath);
var version = realAssembly.GetName().Version;
_redirects[name] = version;
}
catch (Exception ex)
{
Trace.WriteLine("Warning: Could not determine version of " + name + " to use! " + ex.Message);
}
}

/// <summary>
/// Overrides assembly resolution to redirect if necessary.
/// </summary>
private static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
{
var requestedAssembly = new AssemblyName(args.Name);

if (_redirects.ContainsKey(requestedAssembly.Name) && requestedAssembly.Version != _redirects[requestedAssembly.Name])
{
requestedAssembly.Version = _redirects[requestedAssembly.Name];
return Assembly.Load(requestedAssembly);
}
return null;
}
}
}
3 changes: 3 additions & 0 deletions src/React.MSBuild/MSBuildHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

using System;
using System.Diagnostics;
using System.Reflection;

namespace React.MSBuild
{
Expand Down Expand Up @@ -36,6 +37,8 @@ public static bool EnsureInitialized()
/// <returns></returns>
private static bool Initialize()
{
AssemblyBindingRedirect.Enable();

// All "per-request" registrations should be singletons in MSBuild, since there's no
// such thing as a "request"
Initializer.Initialize(requestLifetimeRegistration: registration => registration.AsSingleton());
Expand Down
5 changes: 2 additions & 3 deletions src/React.Sample.Cassette/React.Sample.Cassette.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,8 @@
<HintPath>..\packages\Cassette.Views.2.4.2\lib\net40\Cassette.Views.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="JavaScriptEngineSwitcher.Core, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.Core.2.2.0\lib\net40-client\JavaScriptEngineSwitcher.Core.dll</HintPath>
<Private>True</Private>
<Reference Include="JavaScriptEngineSwitcher.Core, Version=2.4.9.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.Core.2.4.9\lib\net40-client\JavaScriptEngineSwitcher.Core.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="System" />
Expand Down
2 changes: 1 addition & 1 deletion src/React.Sample.Cassette/Web.config
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="JavaScriptEngineSwitcher.Core" publicKeyToken="c608b2a8cc9e4472" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
<bindingRedirect oldVersion="0.0.0.0-2.4.9.0" newVersion="2.4.9.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
Expand Down
2 changes: 1 addition & 1 deletion src/React.Sample.Cassette/packages.config
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<package id="Cassette.Aspnet" version="2.4.2" targetFramework="net40" />
<package id="Cassette.MSBuild" version="2.4.2" targetFramework="net40" />
<package id="Cassette.Views" version="2.4.2" targetFramework="net40" />
<package id="JavaScriptEngineSwitcher.Core" version="2.2.0" targetFramework="net40" />
<package id="JavaScriptEngineSwitcher.Core" version="2.4.9" targetFramework="net40" />
<package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net40" />
<package id="Microsoft.AspNet.Mvc.FixedDisplayModes" version="1.0.0" targetFramework="net40" />
<package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net40" />
Expand Down
25 changes: 10 additions & 15 deletions src/React.Sample.Mvc4/React.Sample.Mvc4.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -57,26 +57,21 @@
<HintPath>..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ClearScript, Version=5.4.8.0, Culture=neutral, PublicKeyToken=935d0c957da47c73, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.V8.2.2.0\lib\net45\ClearScript.dll</HintPath>
<Private>True</Private>
<Reference Include="ClearScript, Version=5.4.9.0, Culture=neutral, PublicKeyToken=935d0c957da47c73, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.V8.2.4.2\lib\net45\ClearScript.dll</HintPath>
</Reference>
<Reference Include="JavaScriptEngineSwitcher.Core, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.Core.2.2.0\lib\net45\JavaScriptEngineSwitcher.Core.dll</HintPath>
<Private>True</Private>
<Reference Include="JavaScriptEngineSwitcher.Core, Version=2.4.9.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.Core.2.4.9\lib\net45\JavaScriptEngineSwitcher.Core.dll</HintPath>
</Reference>
<Reference Include="JavaScriptEngineSwitcher.Msie, Version=2.3.2.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.Msie.2.3.2\lib\net45\JavaScriptEngineSwitcher.Msie.dll</HintPath>
<Private>True</Private>
<Reference Include="JavaScriptEngineSwitcher.Msie, Version=2.4.9.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.Msie.2.4.9\lib\net45\JavaScriptEngineSwitcher.Msie.dll</HintPath>
</Reference>
<Reference Include="JavaScriptEngineSwitcher.V8, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.V8.2.2.0\lib\net45\JavaScriptEngineSwitcher.V8.dll</HintPath>
<Private>True</Private>
<Reference Include="JavaScriptEngineSwitcher.V8, Version=2.4.2.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.V8.2.4.2\lib\net45\JavaScriptEngineSwitcher.V8.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="MsieJavaScriptEngine, Version=2.1.2.0, Culture=neutral, PublicKeyToken=a3a2846a37ac0d3e, processorArchitecture=MSIL">
<HintPath>..\packages\MsieJavaScriptEngine.2.1.2\lib\net45\MsieJavaScriptEngine.dll</HintPath>
<Private>True</Private>
<Reference Include="MsieJavaScriptEngine, Version=2.2.2.0, Culture=neutral, PublicKeyToken=a3a2846a37ac0d3e, processorArchitecture=MSIL">
<HintPath>..\packages\MsieJavaScriptEngine.2.2.2\lib\net45\MsieJavaScriptEngine.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
Expand Down
6 changes: 5 additions & 1 deletion src/React.Sample.Mvc4/Web.config
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="JavaScriptEngineSwitcher.Core" publicKeyToken="c608b2a8cc9e4472" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
<bindingRedirect oldVersion="0.0.0.0-2.4.9.0" newVersion="2.4.9.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
Expand All @@ -92,6 +92,10 @@
<assemblyIdentity name="JavaScriptEngineSwitcher.Msie" publicKeyToken="c608b2a8cc9e4472" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.3.2.0" newVersion="2.3.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="MsieJavaScriptEngine" publicKeyToken="a3a2846a37ac0d3e" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.2.2.0" newVersion="2.2.2.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>

Expand Down
8 changes: 4 additions & 4 deletions src/React.Sample.Mvc4/packages.config
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Antlr" version="3.5.0.2" targetFramework="net45" />
<package id="JavaScriptEngineSwitcher.Core" version="2.2.0" targetFramework="net45" />
<package id="JavaScriptEngineSwitcher.Msie" version="2.3.2" targetFramework="net45" />
<package id="JavaScriptEngineSwitcher.V8" version="2.2.0" targetFramework="net45" />
<package id="JavaScriptEngineSwitcher.Core" version="2.4.9" targetFramework="net45" />
<package id="JavaScriptEngineSwitcher.Msie" version="2.4.9" targetFramework="net45" />
<package id="JavaScriptEngineSwitcher.V8" version="2.4.2" targetFramework="net45" />
<package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net4" />
<package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net4" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net4" />
<package id="Microsoft.AspNet.WebPages" version="2.0.30506.0" targetFramework="net4" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net4" />
<package id="MsieJavaScriptEngine" version="2.1.2" targetFramework="net45" />
<package id="MsieJavaScriptEngine" version="2.2.2" targetFramework="net45" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
<package id="WebActivatorEx" version="2.2.0" targetFramework="net45" />
<package id="WebGrease" version="1.6.0" targetFramework="net45" />
Expand Down
2 changes: 1 addition & 1 deletion src/React.Sample.Mvc6/React.Sample.Mvc6.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
</ItemGroup>

<ItemGroup Condition=" '$(TargetFramework)' == 'net451' ">
<PackageReference Include="JavaScriptEngineSwitcher.V8" Version="2.2.0" />
<PackageReference Include="JavaScriptEngineSwitcher.V8" Version="2.4.2" />
<Reference Include="System" />
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
Expand Down
15 changes: 6 additions & 9 deletions src/React.Sample.Webpack/React.Sample.Webpack.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -50,17 +50,14 @@
<NoWarn>1607</NoWarn>
</PropertyGroup>
<ItemGroup>
<Reference Include="ClearScript, Version=5.4.8.0, Culture=neutral, PublicKeyToken=935d0c957da47c73, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.V8.2.2.0\lib\net40-client\ClearScript.dll</HintPath>
<Private>True</Private>
<Reference Include="ClearScript, Version=5.4.9.0, Culture=neutral, PublicKeyToken=935d0c957da47c73, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.V8.2.4.2\lib\net40-client\ClearScript.dll</HintPath>
</Reference>
<Reference Include="JavaScriptEngineSwitcher.Core, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.Core.2.2.0\lib\net40-client\JavaScriptEngineSwitcher.Core.dll</HintPath>
<Private>True</Private>
<Reference Include="JavaScriptEngineSwitcher.Core, Version=2.4.9.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.Core.2.4.9\lib\net40-client\JavaScriptEngineSwitcher.Core.dll</HintPath>
</Reference>
<Reference Include="JavaScriptEngineSwitcher.V8, Version=2.2.0.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.V8.2.2.0\lib\net40-client\JavaScriptEngineSwitcher.V8.dll</HintPath>
<Private>True</Private>
<Reference Include="JavaScriptEngineSwitcher.V8, Version=2.4.2.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
<HintPath>..\packages\JavaScriptEngineSwitcher.V8.2.4.2\lib\net40-client\JavaScriptEngineSwitcher.V8.dll</HintPath>
</Reference>
<Reference Include="Microsoft.CSharp" />
<Reference Include="System" />
Expand Down
2 changes: 1 addition & 1 deletion src/React.Sample.Webpack/Web.config
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="JavaScriptEngineSwitcher.Core" publicKeyToken="c608b2a8cc9e4472" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
<bindingRedirect oldVersion="0.0.0.0-2.4.9.0" newVersion="2.4.9.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="JavaScriptEngineSwitcher.V8" publicKeyToken="c608b2a8cc9e4472" culture="neutral" />
Expand Down
4 changes: 2 additions & 2 deletions src/React.Sample.Webpack/packages.config
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="JavaScriptEngineSwitcher.Core" version="2.2.0" targetFramework="net40" />
<package id="JavaScriptEngineSwitcher.V8" version="2.2.0" targetFramework="net40" />
<package id="JavaScriptEngineSwitcher.Core" version="2.4.9" targetFramework="net40" />
<package id="JavaScriptEngineSwitcher.V8" version="2.4.2" targetFramework="net40" />
<package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net40" />
<package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net40" />
<package id="Microsoft.AspNet.WebPages" version="2.0.30506.0" targetFramework="net40" />
Expand Down
Loading

0 comments on commit e6ce44a

Please sign in to comment.