Skip to content

Commit

Permalink
Merge 689b87d into 69ccae3
Browse files Browse the repository at this point in the history
  • Loading branch information
mkaring authored Oct 16, 2021
2 parents 69ccae3 + 689b87d commit f0c4f2c
Show file tree
Hide file tree
Showing 27 changed files with 180 additions and 22 deletions.
5 changes: 4 additions & 1 deletion Confuser.Renamer/Analyzers/VTableAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,9 @@ static void CreateSiblingReference<T>(T basePropDef, ref T discoveredBaseMemberD
// Check if the discovered base type is the current type. If so, nothing needs to be done.
if (ReferenceEquals(basePropDef, discoveredBaseMemberDef)) return;

service.AddReference(basePropDef, new MemberSiblingReference(basePropDef, discoveredBaseMemberDef));
var reference = new MemberSiblingReference(basePropDef, discoveredBaseMemberDef);
service.AddReference(basePropDef, reference);
service.AddReference(discoveredBaseMemberDef, reference);
UpdateOldestSiblingReference(discoveredBaseMemberDef, basePropDef, service);
}
}
Expand Down Expand Up @@ -188,6 +190,7 @@ static void RedirectSiblingReferences(IMemberDef oldMemberDef, IMemberDef newMem
static void CreateOverrideReference(INameService service, IMemberDef thisMemberDef, IMemberDef baseMemberDef) {
var overrideRef = new MemberOverrideReference(thisMemberDef, baseMemberDef);
service.AddReference(thisMemberDef, overrideRef);
service.AddReference(baseMemberDef, overrideRef);

PropagateRenamingRestrictions(service, thisMemberDef, baseMemberDef);
}
Expand Down
3 changes: 2 additions & 1 deletion Confuser.Renamer/INameReference.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Confuser.Core;
using dnlib.DotNet;

namespace Confuser.Renamer {
public interface INameReference {
Expand All @@ -15,7 +16,7 @@ public interface INameReference {
/// <returns>
/// <see langword="true" /> in case the reference can't be resolved yet;
/// otherwise <see langword="false" />.</returns>
bool DelayRenaming(INameService service);
bool DelayRenaming(INameService service, IDnlibDef currentDef);

/// <summary>
/// Update the name reference.
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/References/BAMLAttributeReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public BAMLAttributeReference(IDnlibDef member, PropertyRecord rec) {
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

public bool UpdateNameReference(ConfuserContext context, INameService service) {
if (attrRec != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public BAMLConverterMemberReference(BAMLAnalyzer.XmlNsContext xmlnsCtx, TypeSig
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

public bool UpdateNameReference(ConfuserContext context, INameService service) {
string typeName = sig.ReflectionName;
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/References/BAMLConverterTypeReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public BAMLConverterTypeReference(BAMLAnalyzer.XmlNsContext xmlnsCtx, TypeSig si
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

public bool UpdateNameReference(ConfuserContext context, INameService service) {
string name = sig.ReflectionName;
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/References/BAMLEnumReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public BAMLEnumReference(FieldDef enumField, PropertyRecord rec) {
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

public bool UpdateNameReference(ConfuserContext context, INameService service) {
if (UTF8String.Equals(rec.Value, enumField.Name)) return false;
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/References/BAMLPathTypeReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ private BAMLPathTypeReference(BAMLAnalyzer.XmlNsContext xmlnsCtx, TypeSig sig) {
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

public BAMLPathTypeReference(BAMLAnalyzer.XmlNsContext xmlnsCtx, TypeSig sig, PropertyPathIndexUpdater indexerInfo) : this(xmlnsCtx, sig) =>
IndexerInfo = indexerInfo;
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/References/BAMLTypeReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public bool UpdateNameReference(ConfuserContext context, INameService service) {
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

public override string ToString() => ToString(null);

Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/References/CAMemberReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public CAMemberReference(CANamedArgument namedArg, IDnlibDef definition) {
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

public bool UpdateNameReference(ConfuserContext context, INameService service) {
if (UTF8String.Equals(namedArg.Name, definition.Name)) return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public MemberOldestSiblingReference(IMemberDef oldestSiblingDef, IMemberDef othe
public bool ShouldCancelRename => false;

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

/// <inheritdoc />
public bool UpdateNameReference(ConfuserContext context, INameService service) => false;
Expand Down
7 changes: 5 additions & 2 deletions Confuser.Renamer/References/MemberOverrideReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public sealed class MemberOverrideReference : INameReference<IDnlibDef> {
readonly IMemberDef thisMemberDef;
internal IMemberDef BaseMemberDef { get; }

public bool ShouldCancelRename => false;
public bool ShouldCancelRename => thisMemberDef.Module != BaseMemberDef.Module;

public MemberOverrideReference(IMemberDef thisMemberDef, IMemberDef baseMemberDef) {
this.thisMemberDef = thisMemberDef ?? throw new ArgumentNullException(nameof(thisMemberDef));
Expand All @@ -18,7 +18,10 @@ public MemberOverrideReference(IMemberDef thisMemberDef, IMemberDef baseMemberDe
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => !service.IsRenamed(BaseMemberDef);
public bool DelayRenaming(INameService service, IDnlibDef currentDef) =>
currentDef != BaseMemberDef
&& !ShouldCancelRename
&& !service.IsRenamed(BaseMemberDef);

public bool UpdateNameReference(ConfuserContext context, INameService service) {
if (UTF8String.Equals(thisMemberDef.Name, BaseMemberDef.Name)) return false;
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/References/MemberRefReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public MemberRefReference(MemberRef memberRef, IMemberDef memberDef) {
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

public bool UpdateNameReference(ConfuserContext context, INameService service) {
if (UTF8String.Equals(memberRef.Name, memberDef.Name)) return false;
Expand Down
7 changes: 5 additions & 2 deletions Confuser.Renamer/References/MemberSiblingReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,13 @@ public MemberSiblingReference(IMemberDef thisMemberDef, IMemberDef oldestSibling
}

/// <inheritdoc />
public bool ShouldCancelRename => false;
public bool ShouldCancelRename => ThisMemberDef.Module != OldestSiblingDef.Module;

/// <inheritdoc />
public bool DelayRenaming(INameService service) => !service.IsRenamed(OldestSiblingDef);
public bool DelayRenaming(INameService service, IDnlibDef currentDef) =>
currentDef != OldestSiblingDef
&& !ShouldCancelRename
&& !service.IsRenamed(OldestSiblingDef);

/// <inheritdoc />
public bool UpdateNameReference(ConfuserContext context, INameService service) {
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/References/OverrideDirectiveReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public OverrideDirectiveReference(VTableSlot thisSlot, VTableSlot baseSlot) {
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

public bool UpdateNameReference(ConfuserContext context, INameService service) => false;

Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/References/RequiredPrefixReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ internal RequiredPrefixReference(T def, string prefix) {
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

/// <inheritdoc />
public bool UpdateNameReference(ConfuserContext context, INameService service) {
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/References/ResourceReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public ResourceReference(Resource resource, TypeDef typeDef, string format) {
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

public bool UpdateNameReference(ConfuserContext context, INameService service) {
var newName = string.Format(CultureInfo.InvariantCulture, format, typeDef.ReflectionFullName);
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/References/StringMemberNameReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public StringMemberNameReference(Instruction reference, IMemberDef memberDef) {
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

public bool UpdateNameReference(ConfuserContext context, INameService service) {
switch (_reference.Operand) {
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/References/StringTypeReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public StringTypeReference(Instruction reference, TypeDef typeDef) {
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

public bool UpdateNameReference(ConfuserContext context, INameService service) {
switch (reference.Operand) {
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/References/TypeRefReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public TypeRefReference(TypeRef typeRef, TypeDef typeDef) {
}

/// <inheritdoc />
public bool DelayRenaming(INameService service) => false;
public bool DelayRenaming(INameService service, IDnlibDef currentDef) => false;

public bool UpdateNameReference(ConfuserContext context, INameService service) {
if (UTF8String.Equals(typeRef.Namespace, typeDef.Namespace) &&
Expand Down
2 changes: 1 addition & 1 deletion Confuser.Renamer/RenamePhase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ static IEnumerable<IDnlibDef> GetTargetsWithDelay(IList<IDnlibDef> definitions,
var lastCount = -1;
while (currentList.Any()) {
foreach (var def in currentList) {
if (service.GetReferences(def).Any(r => r.DelayRenaming(service)))
if (service.GetReferences(def).Any(r => r.DelayRenaming(service, def)))
delayedItems.Add(def);
else
yield return def;
Expand Down
45 changes: 45 additions & 0 deletions Confuser2.sln
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "389_MixedCultureCasing", "T
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "389_MixedCultureCasing.Test", "Tests\389_MixedCultureCasing.Test\389_MixedCultureCasing.Test.csproj", "{D1CCDA5D-E460-4ACC-B51A-730DE8F0ECF3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlockingReferences", "Tests\BlockingReferences\BlockingReferences.csproj", "{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlockingReferencesHelper", "Tests\BlockingReferencesHelper\BlockingReferencesHelper.csproj", "{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlockingReferences.Test", "Tests\BlockingReferences.Test\BlockingReferences.Test.csproj", "{4FB03AD0-96FF-4730-801A-4F997795D920}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -866,6 +872,42 @@ Global
{D1CCDA5D-E460-4ACC-B51A-730DE8F0ECF3}.Release|x64.Build.0 = Release|Any CPU
{D1CCDA5D-E460-4ACC-B51A-730DE8F0ECF3}.Release|x86.ActiveCfg = Release|Any CPU
{D1CCDA5D-E460-4ACC-B51A-730DE8F0ECF3}.Release|x86.Build.0 = Release|Any CPU
{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Debug|x64.ActiveCfg = Debug|Any CPU
{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Debug|x64.Build.0 = Debug|Any CPU
{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Debug|x86.ActiveCfg = Debug|Any CPU
{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Debug|x86.Build.0 = Debug|Any CPU
{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Release|Any CPU.Build.0 = Release|Any CPU
{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Release|x64.ActiveCfg = Release|Any CPU
{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Release|x64.Build.0 = Release|Any CPU
{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Release|x86.ActiveCfg = Release|Any CPU
{F602DAFE-E8A2-4CB2-AF0E-656CD357D821}.Release|x86.Build.0 = Release|Any CPU
{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Debug|x64.ActiveCfg = Debug|Any CPU
{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Debug|x64.Build.0 = Debug|Any CPU
{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Debug|x86.ActiveCfg = Debug|Any CPU
{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Debug|x86.Build.0 = Debug|Any CPU
{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Release|Any CPU.Build.0 = Release|Any CPU
{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Release|x64.ActiveCfg = Release|Any CPU
{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Release|x64.Build.0 = Release|Any CPU
{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Release|x86.ActiveCfg = Release|Any CPU
{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD}.Release|x86.Build.0 = Release|Any CPU
{4FB03AD0-96FF-4730-801A-4F997795D920}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4FB03AD0-96FF-4730-801A-4F997795D920}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4FB03AD0-96FF-4730-801A-4F997795D920}.Debug|x64.ActiveCfg = Debug|Any CPU
{4FB03AD0-96FF-4730-801A-4F997795D920}.Debug|x64.Build.0 = Debug|Any CPU
{4FB03AD0-96FF-4730-801A-4F997795D920}.Debug|x86.ActiveCfg = Debug|Any CPU
{4FB03AD0-96FF-4730-801A-4F997795D920}.Debug|x86.Build.0 = Debug|Any CPU
{4FB03AD0-96FF-4730-801A-4F997795D920}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4FB03AD0-96FF-4730-801A-4F997795D920}.Release|Any CPU.Build.0 = Release|Any CPU
{4FB03AD0-96FF-4730-801A-4F997795D920}.Release|x64.ActiveCfg = Release|Any CPU
{4FB03AD0-96FF-4730-801A-4F997795D920}.Release|x64.Build.0 = Release|Any CPU
{4FB03AD0-96FF-4730-801A-4F997795D920}.Release|x86.ActiveCfg = Release|Any CPU
{4FB03AD0-96FF-4730-801A-4F997795D920}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -923,6 +965,9 @@ Global
{5E9715AB-CAF7-4FFF-8E14-A8727891DA93} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB}
{75E5F9A0-8D69-4426-9F16-4A65E941974D} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB}
{D1CCDA5D-E460-4ACC-B51A-730DE8F0ECF3} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB}
{F602DAFE-E8A2-4CB2-AF0E-656CD357D821} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB}
{9EB8DC3B-60DC-451E-8C18-3D7E38D463FD} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB}
{4FB03AD0-96FF-4730-801A-4F997795D920} = {356BDB31-853E-43BB-8F9A-D8AC08F69EBB}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {0D937D9E-E04B-4A68-B639-D4260473A388}
Expand Down
11 changes: 11 additions & 0 deletions Tests/BlockingReferences.Test/BlockingReferences.Test.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net461</TargetFramework>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\BlockingReferences\BlockingReferences.csproj" />
<ProjectReference Include="..\Confuser.UnitTest\Confuser.UnitTest.csproj" />
</ItemGroup>
</Project>
42 changes: 42 additions & 0 deletions Tests/BlockingReferences.Test/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using System.Threading.Tasks;
using Confuser.Core;
using Confuser.Core.Project;
using Confuser.UnitTest;
using Xunit;
using Xunit.Abstractions;

namespace BlockingReferences.Test {
public class BlockingReferencesTest : TestBase {
public BlockingReferencesTest(ITestOutputHelper outputHelper) : base(outputHelper) { }

[Fact]
[Trait("Category", "Protection")]
[Trait("Protection", "rename")]
[Trait("Issue", "https://github.com/mkaring/ConfuserEx/issues/379")]
public async Task BlockingReferences() =>
await BlockingReferencesInternal("BlockingReferences.exe", "BlockingReferencesHelper.dll");

[Fact]
[Trait("Category", "Protection")]
[Trait("Protection", "rename")]
[Trait("Issue", "https://github.com/mkaring/ConfuserEx/issues/379")]
public async Task BlockingReferencesReverse() =>
await BlockingReferencesInternal("BlockingReferencesHelper.dll", "BlockingReferences.exe");

private async Task BlockingReferencesInternal(params string[] files) =>
await Run(
files,
new[] {
"",
"Implementation2",
},
new SettingItem<Protection>("rename") {
["renPublic"] = "true",
["mode"] = "decodable"
},
outputAction: line => {
Assert.DoesNotContain("[WARN] Failed to rename all targeted members", line);
}
);
}
}
12 changes: 12 additions & 0 deletions Tests/BlockingReferences/BlockingReferences.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net461</TargetFramework>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\BlockingReferencesHelper\BlockingReferencesHelper.csproj" />
</ItemGroup>

</Project>
26 changes: 26 additions & 0 deletions Tests/BlockingReferences/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using System;
using BlockingReferencesHelper;

namespace BlockingReferences {
public interface IBaseInterface {
string Method();
}

public class Implementation1 : BaseImplementation<string>, IBaseInterface {
}

public class Implementation2 : BaseImplementation<string>, IBaseInterface {
public override string Method() => "Implementation2";
}

public static class Program {
public static int Main() {
Console.WriteLine("START");
Console.WriteLine(new Implementation1().Method());
Console.WriteLine(new Implementation2().Method());
Console.WriteLine("END");

return 42;
}
}
}
5 changes: 5 additions & 0 deletions Tests/BlockingReferencesHelper/BaseImplementation.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
namespace BlockingReferencesHelper {
public class BaseImplementation<T> {
public virtual T Method() => default;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net461</TargetFramework>
</PropertyGroup>

</Project>

0 comments on commit f0c4f2c

Please # to comment.