Skip to content

Commit

Permalink
Adds Post-Processing feature. Related issue #144 (#148)
Browse files Browse the repository at this point in the history
* MvsSln up to rev `9c39498` due to 3F/MvsSln#25

Part of #144

* Post-Processing #148: Implemented backend logic with configurable environment:

Format: $(SolutionPath);$(MSBuildThisFileFullPath);...populated property names...;....

```
<Target Name="DllExportPostProc">

    <!-- Now we can access the following properties and items:

    $(DllExport)     - version
    $(DllExportSln)  - full path to .sln which controls current project
    $(DllExportPrj)  - full path to current project where processed .NET DllExport

    @(DllExportDirX64)    - $(TargetDir)x64\*.*
    @(DllExportDirX86)    - $(TargetDir)x86\*.*
    @(DllExportDirBefore) - $(TargetDir)Before\*.*
    @(DllExportDirAfter)  - $(TargetDir)After\*.*

    @(DllExportDependents + populated property name)
       - each populated properties from DllExportInvokedPoint, e.g. DllExportDependentsTargetDir

    @(DllExportDependencies + populated property name)
      - each populated properties from DllExportInvokedPoint, e.g. DllExportDependenciesTargetDir

    -->

</Target>
```

* Post-Proc. Added support of external .net.dllexport.targets

* PostProc usage has been moved into ExportTaskImplementation

* Fixed MSB4094 when using the same properties

+Checking the existence of our entry point

* `DllExportInvokedPoint` renamed as `DllExportProcEnv`

* Basic GUI support for predefined options in Post-Proc feature

That is,

*! Some Post-Proc features are not yet available in GUI. But you can already configure it with msbuild.

* cleanup

* Updated data in SimpleConfFormater.Parse()

+PostProc +PreProc

* MvsSln up to rev `838fab00dd` /? #148 (comment)

* MvsSln up to rev `e07c5806dd`: +`ProjectReference` support without obsolete projectguid

* Updated MvsSln 2.5.2

* Added multiple destination support via derivative targets:
#148 (comment)

* +`DllExportSeqDependents...` Includes sequential referencing through other projects
  • Loading branch information
3F committed May 7, 2020
1 parent 5524a48 commit 7d54260
Show file tree
Hide file tree
Showing 35 changed files with 1,520 additions and 46 deletions.
2 changes: 1 addition & 1 deletion MvsSln
Submodule MvsSln updated 43 files
+1 −1 .version
+7 −0 MvsSln/Core/IXProject.cs
+20 −6 MvsSln/Core/ProjectReferences.cs
+1 −4 MvsSln/Core/SlnHandlers/LProjectDependencies.cs
+17 −8 MvsSln/Core/SlnParser.cs
+10 −2 MvsSln/Core/XProject.cs
+5 −4 MvsSln/Extensions/CollectionExtension.cs
+14 −17 MvsSln/Extensions/ObjectExtension.cs
+4 −2 MvsSln/Extensions/ProjectExtension.cs
+5 −0 MvsSln/Extensions/StringExtension.cs
+5 −5 MvsSln/InternalsVisibleTo.cs
+8 −4 MvsSln/MvsSln.csproj
+1 −1 MvsSln/MvsSlnVersion.cs
+10 −11 MvsSln/Projects/Item.cs
+12 −1 MvsSln/SlnItems.cs
+ MvsSln/key.snk
+72 −0 MvsSlnTest/Core/ProjectReferencesTest.cs
+36 −0 MvsSlnTest/Extensions/ObjectExtensionTest.cs
+8 −0 MvsSlnTest/Extensions/StringExtensionTest.cs
+14 −26 MvsSlnTest/MvsSlnTest.csproj
+30 −0 MvsSlnTest/SlnResult/ProjectConfigurationPlatformsTest.cs
+12 −0 MvsSlnTest/TestData.cs
+ MvsSlnTest/key.snk
+9 −0 MvsSlnTest/resources/ProjectDependenciesXml/metatag/ClassLibrary1.csproj
+3 −0 MvsSlnTest/resources/ProjectDependenciesXml/metatag/ClassLibrary2.csproj
+31 −0 MvsSlnTest/resources/ProjectDependenciesXml/metatag/test.sln
+9 −0 MvsSlnTest/resources/ProjectDependenciesXml/noprojectguid/ClassLibrary1.csproj
+3 −0 MvsSlnTest/resources/ProjectDependenciesXml/noprojectguid/ClassLibrary2.csproj
+31 −0 MvsSlnTest/resources/ProjectDependenciesXml/noprojectguid/test.sln
+31 −0 MvsSlnTest/resources/ProjectDependenciesXml/noprojectguid/test2.sln
+6 −0 MvsSlnTest/resources/ProjectDependenciesXml/onlypath/ClassLibrary1.csproj
+3 −0 MvsSlnTest/resources/ProjectDependenciesXml/onlypath/ClassLibrary2.csproj
+31 −0 MvsSlnTest/resources/ProjectDependenciesXml/onlypath/test.sln
+12 −0 MvsSlnTest/resources/ProjectDependenciesXml/projectguid/ClassLibrary1.csproj
+6 −0 MvsSlnTest/resources/ProjectDependenciesXml/projectguid/ClassLibrary2.csproj
+31 −0 MvsSlnTest/resources/ProjectDependenciesXml/projectguid/test.sln
+31 −0 MvsSlnTest/resources/ProjectDependenciesXml/projectguid/test2.sln
+6 −2 Readme.md
+1 −1 build.bat
+38 −0 changelog.txt
+ com.github.3F.snk
+ com.github.3F.test.snk
+ resources/MvsSln_and_DllExport_PostProc.png
10 changes: 10 additions & 0 deletions RGiesecke.DllExport.MSBuild/AssemblyInfo.cs
@@ -1,5 +1,6 @@
using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using net.r_eg.DllExport;

Expand All @@ -11,3 +12,12 @@
[assembly: ComVisible(false)]

[assembly: AssemblyVersion(DllExportVersion.S_NUM_REV)]

[assembly: InternalsVisibleTo
(
"net.r_eg.DllExport.Wizard, PublicKey=00240000048000009400000006020000002400005253413100040000010001002ff3c0078e6021" +
"1fd2f8fece1d935ad41c19ed43fd19cc7ef2b397b328d6f9bb391e7f16db5927614aff97f837fa" +
"fa455d8c42701cdcc0f67fc897355a03c0bec67b69c0c5dfb627409d647a5dad09751e4dd6a907" +
"e74b5b07ebd25bd5a62cbcddd6286d8726d6111d8feecd8101d2d681d0e004c0697065d07ba5a5" +
"cce179a4"
)]
95 changes: 95 additions & 0 deletions RGiesecke.DllExport.MSBuild/Executor.cs
@@ -0,0 +1,95 @@
//# Author of original code ([Decompiled] MIT-License): Copyright (c) 2009-2015 Robert Giesecke
//# Use Readme & LICENSE files for details.

//# Modifications: Copyright (c) 2016-2020 Denis Kuzmin < x-3F@outlook.com > GitHub/3F
//$ Distributed under the MIT License (MIT)

using System;
using System.Collections.Generic;
using Microsoft.Build.Execution;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using net.r_eg.DllExport;
using net.r_eg.MvsSln.Core;

namespace RGiesecke.DllExport.MSBuild
{
internal class Executor: IPostProcExecutor
{
private readonly TaskLoggingHelper log;

/// <summary>
/// Executes IXProject through MSBuild engine.
/// </summary>
/// <param name="xp"></param>
/// <param name="entrypoint">Initial target.</param>
/// <param name="properties">Additional properties that will be available when executing code.</param>
/// <returns>True if request was a complete success.</returns>
public bool Execute(IXProject xp, string entrypoint, IDictionary<string, string> properties = null)
{
if(xp == null) {
throw new ArgumentNullException(nameof(xp));
}

UpdateGlobalProperties(xp, properties);

var request = new BuildRequestData
(
xp.Project.CreateProjectInstance(),
new string[] { entrypoint ?? throw new ArgumentNullException(nameof(entrypoint)) },
new HostServices()
);

#if !NET40

using(BuildManager manager = new BuildManager(DllExportVersion.DXP)) {
return Build(manager, request, false);
}

#else

// 4.0.30319
return Build(new BuildManager(DllExportVersion.DXP), request, false);

#endif
}

public Executor(TaskLoggingHelper log)
{
this.log = log ?? throw new ArgumentNullException(nameof(log));
}

protected bool Build(BuildManager manager, BuildRequestData request, bool silent)
{
BuildResult result = manager.Build
(
new BuildParameters()
{
MaxNodeCount = 4,
Loggers = new List<ILogger>()
{
new ExecutorLogger(log) {
Verbosity = silent ? LoggerVerbosity.Quiet : LoggerVerbosity.Normal
}
}
},
request
);

return result.OverallResult == BuildResultCode.Success;
}

private void UpdateGlobalProperties(IXProject xp, IDictionary<string, string> properties)
{
if(properties == null) {
return;
}

foreach(var prop in properties)
{
xp.Project.SetGlobalProperty(prop.Key, prop.Value);
log.LogMessage(MessageImportance.Low, Resources._0_is_configured_as_1, prop.Key, prop.Value);
}
}
}
}
38 changes: 38 additions & 0 deletions RGiesecke.DllExport.MSBuild/ExecutorLogger.cs
@@ -0,0 +1,38 @@
//# Author of original code ([Decompiled] MIT-License): Copyright (c) 2009-2015 Robert Giesecke
//# Use Readme & LICENSE files for details.

//# Modifications: Copyright (c) 2016-2020 Denis Kuzmin < x-3F@outlook.com > GitHub/3F
//$ Distributed under the MIT License (MIT)

using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace RGiesecke.DllExport.MSBuild
{
internal class ExecutorLogger: ILogger
{
private readonly TaskLoggingHelper log;

public string Parameters { get; set; }

public LoggerVerbosity Verbosity { get; set; }

public void Shutdown()
{

}

public void Initialize(IEventSource eventSource)
{
eventSource.WarningRaised += (sender, e) => log.LogWarning($"[{e.LineNumber}]: {e.Code} - '{e.Message}'");
eventSource.ErrorRaised += (sender, e) => log.LogError($"[{e.LineNumber}]: {e.Code} - '{e.Message}'");

if(Verbosity != LoggerVerbosity.Quiet) {
eventSource.AnyEventRaised += (sender, e) => log.LogMessage(MessageImportance.Low, $"{nameof(ExecutorLogger)}: {e.Message}");
}
}

public ExecutorLogger(TaskLoggingHelper log) => this.log = log ?? throw new ArgumentNullException(nameof(log));
}
}
23 changes: 23 additions & 0 deletions RGiesecke.DllExport.MSBuild/IPostProcExecutor.cs
@@ -0,0 +1,23 @@
//# Author of original code ([Decompiled] MIT-License): Copyright (c) 2009-2015 Robert Giesecke
//# Use Readme & LICENSE files for details.

//# Modifications: Copyright (c) 2016-2020 Denis Kuzmin < x-3F@outlook.com > GitHub/3F
//$ Distributed under the MIT License (MIT)

using System.Collections.Generic;
using net.r_eg.MvsSln.Core;

namespace RGiesecke.DllExport.MSBuild
{
internal interface IPostProcExecutor
{
/// <summary>
/// Executes IXProject through MSBuild engine.
/// </summary>
/// <param name="xp"></param>
/// <param name="entrypoint">Initial target.</param>
/// <param name="properties">Additional properties that will be available when executing code.</param>
/// <returns>True if request was a complete success.</returns>
bool Execute(IXProject xp, string entrypoint, IDictionary<string, string> properties = null);
}
}

0 comments on commit 7d54260

Please sign in to comment.