Skip to content

Commit 042c7b9

Browse files
Fix some non-public member names for PSv7 (#7)
1 parent df89f90 commit 042c7b9

7 files changed

Lines changed: 118 additions & 8 deletions

src/ImpliedReflection/Commands/AddPrivateMemberCommand.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@ public class AddPrivateMemberCommand : PSCmdlet
1818

1919
protected override void ProcessRecord()
2020
{
21+
if (PSVersionInfo.PSVersion == PSVersionInfo.Empty)
22+
{
23+
ThrowTerminatingError(
24+
new ErrorRecord(
25+
new PSInvalidOperationException(ImpliedReflectionStrings.UnknownPowerShellVersion),
26+
nameof(ImpliedReflectionStrings.UnknownPowerShellVersion),
27+
ErrorCategory.InvalidOperation,
28+
targetObject: null));
29+
30+
return;
31+
}
32+
2133
if (InputObject == null)
2234
{
2335
return;

src/ImpliedReflection/Commands/DisableImpliedReflectionCommand.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@ public class DisableImpliedReflectionCommand : PSCmdlet
77
{
88
protected override void EndProcessing()
99
{
10+
if (PSVersionInfo.PSVersion == PSVersionInfo.Empty)
11+
{
12+
ThrowTerminatingError(
13+
new ErrorRecord(
14+
new PSInvalidOperationException(ImpliedReflectionStrings.UnknownPowerShellVersion),
15+
nameof(ImpliedReflectionStrings.UnknownPowerShellVersion),
16+
ErrorCategory.InvalidOperation,
17+
targetObject: null));
18+
19+
return;
20+
}
21+
1022
if (!DelegateController.Disable())
1123
{
1224
WriteError(

src/ImpliedReflection/Commands/EnableImpliedReflectionCommand.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@ public class EnableImpliedReflectionCommand : PSCmdlet
1616

1717
protected override void EndProcessing()
1818
{
19+
if (PSVersionInfo.PSVersion == PSVersionInfo.Empty)
20+
{
21+
ThrowTerminatingError(
22+
new ErrorRecord(
23+
new PSInvalidOperationException(ImpliedReflectionStrings.UnknownPowerShellVersion),
24+
nameof(ImpliedReflectionStrings.UnknownPowerShellVersion),
25+
ErrorCategory.InvalidOperation,
26+
targetObject: null));
27+
28+
return;
29+
}
30+
1931
if (!(Force.IsPresent || ShouldContinue()))
2032
{
2133
return;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace ImpliedReflection
2+
{
3+
internal class Core7CLRNames : CoreCLRNames
4+
{
5+
public override string PSObject_DotNetInstanceAdapter => "s_dotNetInstanceAdapter";
6+
7+
public override string PSObject_DotNetStaticAdapter => "s_dotNetStaticAdapter";
8+
}
9+
}

src/ImpliedReflection/PSVersion.cs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using System;
2+
using System.Management.Automation;
3+
using System.Reflection;
4+
5+
namespace ImpliedReflection
6+
{
7+
/// <summary>
8+
/// Represents the real PSVersionInfo class in SMA. Although it recently became public, it
9+
/// still isn't in PSv5 which is what we're preferencing, so more reflection.
10+
/// </summary>
11+
internal static class PSVersionInfo
12+
{
13+
internal static readonly Version Empty = new Version(0, 0);
14+
15+
static PSVersionInfo()
16+
{
17+
Type psVersionInfoType =
18+
typeof(PSObject).Assembly.GetType("System.Management.Automation.PSVersionInfo");
19+
20+
if (psVersionInfoType == null)
21+
{
22+
PSVersion = Empty;
23+
return;
24+
}
25+
26+
PropertyInfo psVersionProperty = psVersionInfoType.GetProperty(
27+
nameof(PSVersion),
28+
Bind.Any.Static);
29+
30+
if (psVersionProperty == null || psVersionProperty.PropertyType != typeof(Version))
31+
{
32+
PSVersion = Empty;
33+
return;
34+
}
35+
36+
object version = null;
37+
try
38+
{
39+
version = psVersionProperty.GetValue(null);
40+
}
41+
catch
42+
{
43+
}
44+
45+
if (version == null)
46+
{
47+
PSVersion = Empty;
48+
return;
49+
}
50+
51+
PSVersion = (Version)version;
52+
}
53+
54+
internal static Version PSVersion { get; }
55+
}
56+
}

src/ImpliedReflection/VersionSpecificMemberNames.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,27 @@
1-
using System.Management.Automation;
2-
3-
namespace ImpliedReflection
1+
namespace ImpliedReflection
42
{
53
internal abstract class VersionSpecificMemberNames
64
{
75
public static VersionSpecificMemberNames PrivateMemberNames;
86

97
static VersionSpecificMemberNames()
108
{
11-
var coreNames = new CoreCLRNames();
12-
if (typeof(PSObject).GetField(coreNames.PSObject_memberCollection, Bind.NonPublic.Static) != null)
9+
PrivateMemberNames = CreateInstance();
10+
}
11+
12+
private static VersionSpecificMemberNames CreateInstance()
13+
{
14+
if (PSVersionInfo.PSVersion.Major >= 7)
15+
{
16+
return new Core7CLRNames();
17+
}
18+
19+
if (PSVersionInfo.PSVersion.Major == 6)
1320
{
14-
PrivateMemberNames = coreNames;
15-
return;
21+
return new CoreCLRNames();
1622
}
1723

18-
PrivateMemberNames = new FullCLRNames();
24+
return new FullCLRNames();
1925
}
2026

2127
/// <summary>

src/ImpliedReflection/resources/ImpliedReflectionStrings.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,7 @@ This can have unintended consequences, are you sure you want to continue?</value
134134
<data name="ConfirmTitle" xml:space="preserve">
135135
<value>Confirm</value>
136136
</data>
137+
<data name="UnknownPowerShellVersion" xml:space="preserve">
138+
<value>Unable to determine the current PowerShell version. If this is a custom build of PowerShell, please file a GitHub issue for guidance.</value>
139+
</data>
137140
</root>

0 commit comments

Comments
 (0)