Skip to content

Commit a3e727b

Browse files
committed
Upgrade to JavaScriptEngineSwitcher 2.0. Closes #306
1 parent 6287ea4 commit a3e727b

File tree

23 files changed

+151
-170
lines changed

23 files changed

+151
-170
lines changed

Diff for: build.proj

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ of patent rights can be found in the PATENTS file in the same directory.
99
-->
1010
<Project ToolsVersion="4.0" DefaultTargets="Build;Test;Package" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
1111
<PropertyGroup>
12-
<Major>2</Major>
13-
<Minor>6</Minor>
12+
<Major>3</Major>
13+
<Minor>0</Minor>
1414
<Build>0</Build>
1515
<Revision>0</Revision>
1616
<DevNuGetServer>http://reactjs.net/packages/</DevNuGetServer>

Diff for: src/Cassette.React/project.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "2.6.0-*",
2+
"version": "3.0.0-*",
33
"title": "ReactJS.NET - Babel for Cassette",
44
"authors": [ "Daniel Lo Nigro" ],
55
"copyright": "Copyright 2014-Present Facebook, Inc",

Diff for: src/React.AspNet/project.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "2.6.0-*",
2+
"version": "3.0.0-*",
33
"authors": [ "Daniel Lo Nigro" ],
44
"copyright": "Copyright 2014-Present Facebook, Inc",
55
"title": "ReactJS.NET (ASP.NET Core MVC)",

Diff for: src/React.Core/AssemblyRegistration.cs

+2-44
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77
* of patent rights can be found in the PATENTS file in the same directory.
88
*/
99

10-
using JavaScriptEngineSwitcher.Msie;
11-
using JavaScriptEngineSwitcher.Msie.Configuration;
12-
using JavaScriptEngineSwitcher.V8;
10+
using JavaScriptEngineSwitcher.Core;
1311
using React.TinyIoC;
1412

1513
namespace React
@@ -37,50 +35,10 @@ public void Register(TinyIoCContainer container)
3735
// One instance shared for the whole app
3836
container.Register<IReactSiteConfiguration>((c, o) => ReactSiteConfiguration.Configuration);
3937
container.Register<IFileCacheHash, FileCacheHash>().AsPerRequestSingleton();
38+
container.Register<JsEngineSwitcher>((c, o) => JsEngineSwitcher.Instance);
4039
container.Register<IJavaScriptEngineFactory, JavaScriptEngineFactory>().AsSingleton();
4140

4241
container.Register<IReactEnvironment, ReactEnvironment>().AsPerRequestSingleton();
43-
RegisterSupportedEngines(container);
44-
}
45-
46-
/// <summary>
47-
/// Registers JavaScript engines that may be able to run in the current environment
48-
/// </summary>
49-
/// <param name="container"></param>
50-
private void RegisterSupportedEngines(TinyIoCContainer container)
51-
{
52-
if (JavaScriptEngineUtils.EnvironmentSupportsClearScript())
53-
{
54-
container.Register(new JavaScriptEngineFactory.Registration
55-
{
56-
Factory = () => new V8JsEngine(),
57-
Priority = 10
58-
}, "ClearScriptV8");
59-
}
60-
if (JavaScriptEngineUtils.EnvironmentSupportsVroomJs())
61-
{
62-
container.Register(new JavaScriptEngineFactory.Registration
63-
{
64-
Factory = () => new VroomJsEngine(),
65-
Priority = 10
66-
}, "VroomJs");
67-
}
68-
69-
container.Register(new JavaScriptEngineFactory.Registration
70-
{
71-
Factory = () => new MsieJsEngine(new MsieConfiguration { EngineMode = JsEngineMode.ChakraEdgeJsRt }),
72-
Priority = 20
73-
}, "MsieChakraEdgeRT");
74-
container.Register(new JavaScriptEngineFactory.Registration
75-
{
76-
Factory = () => new MsieJsEngine(new MsieConfiguration { EngineMode = JsEngineMode.ChakraIeJsRt }),
77-
Priority = 30
78-
}, "MsieChakraIeRT");
79-
container.Register(new JavaScriptEngineFactory.Registration
80-
{
81-
Factory = () => new MsieJsEngine(new MsieConfiguration { EngineMode = JsEngineMode.ChakraActiveScript }),
82-
Priority = 40
83-
}, "MsieChakraActiveScript");
8442
}
8543
}
8644
}

Diff for: src/React.Core/IReactSiteConfiguration.cs

+2
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,13 @@ public interface IReactSiteConfiguration
105105
/// <summary>
106106
/// Gets or sets whether the MSIE engine should be used if V8 is unavailable.
107107
/// </summary>
108+
[Obsolete("This should be managed in the JavaScriptEngineSwitcher configuration instead")]
108109
bool AllowMsieEngine { get; set; }
109110
/// <summary>
110111
/// Sets whether the MSIE engine should be used if V8 is unavailable.
111112
/// </summary>
112113
/// <returns></returns>
114+
[Obsolete("This should be managed in the JavaScriptEngineSwitcher configuration instead")]
113115
IReactSiteConfiguration SetAllowMsieEngine(bool allowMsieEngine);
114116

115117
/// <summary>

Diff for: src/React.Core/JavaScriptEngineFactory.cs

+41-22
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Collections.Concurrent;
3-
using System.Collections.Generic;
43
using System.Diagnostics;
54
using System.Linq;
65
using System.Threading;
@@ -28,7 +27,11 @@ public class JavaScriptEngineFactory : IDisposable, IJavaScriptEngineFactory
2827
/// <summary>
2928
/// Function used to create new JavaScript engine instances.
3029
/// </summary>
31-
protected readonly Func<IJsEngine> _factory;
30+
protected readonly Func<IJsEngine> _factory;
31+
/// <summary>
32+
/// The JavaScript Engine Switcher instance used by ReactJS.NET
33+
/// </summary>
34+
protected readonly JsEngineSwitcher _jsEngineSwitcher;
3235
/// <summary>
3336
/// Contains all current JavaScript engine instances. One per thread, keyed on thread ID.
3437
/// </summary>
@@ -51,14 +54,17 @@ protected readonly ConcurrentDictionary<int, IJsEngine> _engines
5154
/// Initializes a new instance of the <see cref="JavaScriptEngineFactory"/> class.
5255
/// </summary>
5356
public JavaScriptEngineFactory(
54-
IEnumerable<Registration> availableFactories,
57+
JsEngineSwitcher jsEngineSwitcher,
5558
IReactSiteConfiguration config,
5659
IFileSystem fileSystem
5760
)
5861
{
62+
_jsEngineSwitcher = jsEngineSwitcher;
5963
_config = config;
6064
_fileSystem = fileSystem;
61-
_factory = GetFactory(availableFactories, config.AllowMsieEngine);
65+
#pragma warning disable 618
66+
_factory = GetFactory(_jsEngineSwitcher, config.AllowMsieEngine);
67+
#pragma warning restore 618
6268
if (_config.ReuseJavaScriptEngines)
6369
{
6470
_pool = CreatePool();
@@ -229,21 +235,19 @@ public virtual void ReturnEngineToPool(IJsEngine engine)
229235
/// The first functioning JavaScript engine with the lowest priority will be used.
230236
/// </summary>
231237
/// <returns>Function to create JavaScript engine</returns>
232-
private static Func<IJsEngine> GetFactory(IEnumerable<Registration> availableFactories, bool allowMsie)
238+
private static Func<IJsEngine> GetFactory(JsEngineSwitcher jsEngineSwitcher, bool allowMsie)
233239
{
234-
var availableEngineFactories = availableFactories
235-
.OrderBy(x => x.Priority)
236-
.Select(x => x.Factory);
237-
foreach (var engineFactory in availableEngineFactories)
240+
EnsureJsEnginesRegistered(jsEngineSwitcher, allowMsie);
241+
foreach (var engineFactory in jsEngineSwitcher.EngineFactories)
238242
{
239243
IJsEngine engine = null;
240244
try
241245
{
242-
engine = engineFactory();
246+
engine = engineFactory.CreateEngine();
243247
if (EngineIsUsable(engine, allowMsie))
244248
{
245249
// Success! Use this one.
246-
return engineFactory;
250+
return engineFactory.CreateEngine;
247251
}
248252
}
249253
catch (Exception ex)
@@ -329,20 +333,35 @@ public void EnsureValidState()
329333
}
330334

331335
/// <summary>
332-
/// Represents a factory for a supported JavaScript engine.
336+
/// Ensures that some engines have been registered with JavaScriptEngineSwitcher. IF not,
337+
/// registers some default engines.
333338
/// </summary>
334-
public class Registration
339+
/// <param name="jsEngineSwitcher">JavaScript Engine Switcher instance</param>
340+
/// <param name="allowMsie">Whether to allow the MSIE JS engine</param>
341+
private static void EnsureJsEnginesRegistered(JsEngineSwitcher jsEngineSwitcher, bool allowMsie)
335342
{
336-
/// <summary>
337-
/// Gets or sets the factory for this JavaScript engine
338-
/// </summary>
339-
public Func<IJsEngine> Factory { get; set; }
343+
if (jsEngineSwitcher.EngineFactories.Any())
344+
{
345+
// Engines have been registered, nothing to do here!
346+
return;
347+
}
348+
349+
Trace.WriteLine(
350+
"No JavaScript engines were registered, falling back to a default config! It is " +
351+
"recommended that you configure JavaScriptEngineSwitcher in your app. See " +
352+
"https://github.com/Taritsyn/JavaScriptEngineSwitcher/wiki/Registration-of-JS-engines " +
353+
"for more information."
354+
);
340355

341-
/// <summary>
342-
/// Gets or sets the priority for this JavaScript engine. Engines with lower priority
343-
/// are preferred.
344-
/// </summary>
345-
public int Priority { get; set; }
356+
jsEngineSwitcher.EngineFactories.AddV8();
357+
if (allowMsie)
358+
{
359+
jsEngineSwitcher.EngineFactories.AddMsie();
360+
}
361+
if (JavaScriptEngineUtils.EnvironmentSupportsVroomJs())
362+
{
363+
jsEngineSwitcher.EngineFactories.Add(new VroomJsEngine.Factory());
364+
}
346365
}
347366
}
348367
}

Diff for: src/React.Core/VroomJsEngine.cs

+19
Original file line numberDiff line numberDiff line change
@@ -270,5 +270,24 @@ public override void Dispose()
270270
_disposed = true;
271271
}
272272
}
273+
274+
/// <summary>
275+
/// Engine factory for <see cref="VroomJs" />.
276+
/// </summary>
277+
public class Factory : IJsEngineFactory
278+
{
279+
/// <summary>
280+
/// Creates the engine
281+
/// </summary>
282+
public IJsEngine CreateEngine()
283+
{
284+
return new VroomJsEngine();
285+
}
286+
287+
/// <summary>
288+
/// Gets the name of the engine.
289+
/// </summary>
290+
public string EngineName => "VroomJs";
291+
}
273292
}
274293
}

Diff for: src/React.Core/project.json

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "2.6.0-*",
2+
"version": "3.0.0-*",
33
"title": "ReactJS.NET Core",
44
"authors": [ "Daniel Lo Nigro" ],
55
"copyright": "Copyright 2014-Present Facebook, Inc",
@@ -33,11 +33,11 @@
3333
},
3434

3535
"dependencies": {
36-
"JavaScriptEngineSwitcher.Core": "1.5.0",
37-
"JavaScriptEngineSwitcher.Msie": "1.5.0",
38-
"JavaScriptEngineSwitcher.V8": "1.5.8",
39-
"JSPool": "0.4.1",
40-
"MsieJavaScriptEngine": "1.7.2",
36+
"JavaScriptEngineSwitcher.Core": "2.0.0",
37+
"JavaScriptEngineSwitcher.Msie": "2.0.0",
38+
"JavaScriptEngineSwitcher.V8": "2.0.0",
39+
"JSPool": "2.0.0",
40+
"MsieJavaScriptEngine": "2.0.0",
4141
"Newtonsoft.Json": "6.0.8",
4242
"VroomJs": "1.2.3"
4343
},

Diff for: src/React.MSBuild/project.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "2.6.0-*",
2+
"version": "3.0.0-*",
33
"title": "ReactJS.NET - Babel for MSBuild",
44
"authors": [ "Daniel Lo Nigro" ],
55
"copyright": "Copyright 2014-Present Facebook, Inc",

Diff for: src/React.Owin/project.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "2.6.0-*",
2+
"version": "3.0.0-*",
33
"title": "ReactJS.NET - Babel for OWIN",
44
"authors": [ "Daniel Lo Nigro" ],
55
"copyright": "Copyright 2014-Present Facebook, Inc",

Diff for: src/React.Sample.Cassette/Cassette.targets

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
77
<UsingTask AssemblyFile="$(OutputPath)\Cassette.MSBuild.dll" TaskName="CreateBundles"/>
88
<Target Name="Bundle">
9-
<!--CreateBundles /-->
9+
<CreateBundles />
1010
<!--
1111
CreateBundles has the following optional properties:
1212
Source: The root directory of the web application.

Diff for: src/React.Sample.Cassette/React.Sample.Cassette.csproj

+3-3
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@
7272
<HintPath>..\packages\Cassette.Views.2.4.2\lib\net40\Cassette.Views.dll</HintPath>
7373
<Private>True</Private>
7474
</Reference>
75-
<Reference Include="JavaScriptEngineSwitcher.Core, Version=1.5.0.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
76-
<HintPath>..\packages\JavaScriptEngineSwitcher.Core.1.5.0\lib\net40\JavaScriptEngineSwitcher.Core.dll</HintPath>
75+
<Reference Include="JavaScriptEngineSwitcher.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
76+
<HintPath>..\packages\JavaScriptEngineSwitcher.Core.2.0.0\lib\net40-client\JavaScriptEngineSwitcher.Core.dll</HintPath>
7777
<Private>True</Private>
7878
</Reference>
7979
<Reference Include="Microsoft.CSharp" />
@@ -236,4 +236,4 @@
236236
</Target>
237237
<Target Name="AfterBuild">
238238
</Target> -->
239-
</Project>
239+
</Project>

Diff for: src/React.Sample.Cassette/packages.config

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<package id="Cassette.Aspnet" version="2.4.2" targetFramework="net40" />
66
<package id="Cassette.MSBuild" version="2.4.2" targetFramework="net40" />
77
<package id="Cassette.Views" version="2.4.2" targetFramework="net40" />
8-
<package id="JavaScriptEngineSwitcher.Core" version="1.5.0" targetFramework="net40" />
8+
<package id="JavaScriptEngineSwitcher.Core" version="2.0.0" targetFramework="net40" />
99
<package id="Microsoft.AspNet.Mvc" version="4.0.30506.0" targetFramework="net40" />
1010
<package id="Microsoft.AspNet.Mvc.FixedDisplayModes" version="1.0.0" targetFramework="net40" />
1111
<package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net40" />

Diff for: src/React.Sample.Mvc4/React.Sample.Mvc4.csproj

+13-29
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3-
<Import Project="..\packages\JavaScriptEngineSwitcher.V8.1.5.8\build\JavaScriptEngineSwitcher.V8.props" Condition="Exists('..\packages\JavaScriptEngineSwitcher.V8.1.5.8\build\JavaScriptEngineSwitcher.V8.props')" />
3+
<Import Project="..\packages\JavaScriptEngineSwitcher.V8.2.0.0\build\JavaScriptEngineSwitcher.V8.props" Condition="Exists('..\packages\JavaScriptEngineSwitcher.V8.2.0.0\build\JavaScriptEngineSwitcher.V8.props')" />
44
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
55
<PropertyGroup>
66
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -58,25 +58,25 @@
5858
<HintPath>..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll</HintPath>
5959
<Private>True</Private>
6060
</Reference>
61-
<Reference Include="ClearScript, Version=5.4.6.0, Culture=neutral, PublicKeyToken=935d0c957da47c73, processorArchitecture=MSIL">
62-
<HintPath>..\packages\JavaScriptEngineSwitcher.V8.1.5.8\lib\net40\ClearScript.dll</HintPath>
61+
<Reference Include="ClearScript, Version=5.4.7.0, Culture=neutral, PublicKeyToken=935d0c957da47c73, processorArchitecture=MSIL">
62+
<HintPath>..\packages\JavaScriptEngineSwitcher.V8.2.0.0\lib\net40-client\ClearScript.dll</HintPath>
6363
<Private>True</Private>
6464
</Reference>
65-
<Reference Include="JavaScriptEngineSwitcher.Core, Version=1.5.0.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
66-
<HintPath>..\packages\JavaScriptEngineSwitcher.Core.1.5.0\lib\net40\JavaScriptEngineSwitcher.Core.dll</HintPath>
65+
<Reference Include="JavaScriptEngineSwitcher.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
66+
<HintPath>..\packages\JavaScriptEngineSwitcher.Core.2.0.0\lib\net40-client\JavaScriptEngineSwitcher.Core.dll</HintPath>
6767
<Private>True</Private>
6868
</Reference>
69-
<Reference Include="JavaScriptEngineSwitcher.Msie, Version=1.5.0.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
70-
<HintPath>..\packages\JavaScriptEngineSwitcher.Msie.1.5.0\lib\net40\JavaScriptEngineSwitcher.Msie.dll</HintPath>
69+
<Reference Include="JavaScriptEngineSwitcher.Msie, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
70+
<HintPath>..\packages\JavaScriptEngineSwitcher.Msie.2.0.0\lib\net40-client\JavaScriptEngineSwitcher.Msie.dll</HintPath>
7171
<Private>True</Private>
7272
</Reference>
73-
<Reference Include="JavaScriptEngineSwitcher.V8, Version=1.5.8.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
74-
<HintPath>..\packages\JavaScriptEngineSwitcher.V8.1.5.8\lib\net40\JavaScriptEngineSwitcher.V8.dll</HintPath>
73+
<Reference Include="JavaScriptEngineSwitcher.V8, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c608b2a8cc9e4472, processorArchitecture=MSIL">
74+
<HintPath>..\packages\JavaScriptEngineSwitcher.V8.2.0.0\lib\net40-client\JavaScriptEngineSwitcher.V8.dll</HintPath>
7575
<Private>True</Private>
7676
</Reference>
7777
<Reference Include="Microsoft.CSharp" />
78-
<Reference Include="MsieJavaScriptEngine, Version=1.7.0.0, Culture=neutral, PublicKeyToken=a3a2846a37ac0d3e, processorArchitecture=MSIL">
79-
<HintPath>..\packages\MsieJavaScriptEngine.1.7.0\lib\net40\MsieJavaScriptEngine.dll</HintPath>
78+
<Reference Include="MsieJavaScriptEngine, Version=2.0.0.0, Culture=neutral, PublicKeyToken=a3a2846a37ac0d3e, processorArchitecture=MSIL">
79+
<HintPath>..\packages\MsieJavaScriptEngine.2.0.0\lib\net40-client\MsieJavaScriptEngine.dll</HintPath>
8080
<Private>True</Private>
8181
</Reference>
8282
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
@@ -168,22 +168,6 @@
168168
<ItemGroup>
169169
<Compile Include="App_Start\FilterConfig.cs" />
170170
<Compile Include="App_Start\RouteConfig.cs" />
171-
<Content Include="..\packages\JavaScriptEngineSwitcher.V8.1.5.8\content\ClearScript.V8\ClearScriptV8-32.dll">
172-
<Link>ClearScript.V8\ClearScriptV8-32.dll</Link>
173-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
174-
</Content>
175-
<Content Include="..\packages\JavaScriptEngineSwitcher.V8.1.5.8\content\ClearScript.V8\ClearScriptV8-64.dll">
176-
<Link>ClearScript.V8\ClearScriptV8-64.dll</Link>
177-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
178-
</Content>
179-
<Content Include="..\packages\JavaScriptEngineSwitcher.V8.1.5.8\content\ClearScript.V8\v8-ia32.dll">
180-
<Link>ClearScript.V8\v8-ia32.dll</Link>
181-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
182-
</Content>
183-
<Content Include="..\packages\JavaScriptEngineSwitcher.V8.1.5.8\content\ClearScript.V8\v8-x64.dll">
184-
<Link>ClearScript.V8\v8-x64.dll</Link>
185-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
186-
</Content>
187171
<Content Include="Content\Sample.css" />
188172
<Content Include="Global.asax" />
189173
<Content Include="Web.config" />
@@ -244,12 +228,12 @@
244228
<PropertyGroup>
245229
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
246230
</PropertyGroup>
247-
<Error Condition="!Exists('..\packages\JavaScriptEngineSwitcher.V8.1.5.8\build\JavaScriptEngineSwitcher.V8.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\JavaScriptEngineSwitcher.V8.1.5.8\build\JavaScriptEngineSwitcher.V8.props'))" />
231+
<Error Condition="!Exists('..\packages\JavaScriptEngineSwitcher.V8.2.0.0\build\JavaScriptEngineSwitcher.V8.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\JavaScriptEngineSwitcher.V8.2.0.0\build\JavaScriptEngineSwitcher.V8.props'))" />
248232
</Target>
249233
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
250234
Other similar extension points exist, see Microsoft.Common.targets.
251235
<Target Name="BeforeBuild">
252236
</Target>
253237
<Target Name="AfterBuild">
254238
</Target> -->
255-
</Project>
239+
</Project>

0 commit comments

Comments
 (0)