Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #6 from LogosBible/fix-resxfileref
Browse files Browse the repository at this point in the history
Use ResXFileRef from this project
farlee2121 authored Dec 3, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
2 parents 84243d1 + 17a8bb4 commit bdad919
Showing 11 changed files with 541 additions and 11 deletions.
21 changes: 14 additions & 7 deletions System.Resources.NetStandard/ResXDataNode.cs
Original file line number Diff line number Diff line change
@@ -47,13 +47,13 @@ public sealed class ResXDataNode : ISerializable
// No public property to force using constructors for the following reasons:
// 1. one of the constructors needs this field (if used) to initialize the object, make it consistent with the other ctrs to avoid errors.
// 2. once the object is constructed the delegate should not be changed to avoid getting inconsistent results.
private Func<Type, string> typeNameConverter;
private Func<Type, string> typeNameConverter = WinformsTypeMappers.InterceptWinformsTypes(null);

private ResXDataNode()
{
}

internal ResXDataNode DeepClone()
public ResXDataNode DeepClone()
{
return new ResXDataNode
{
@@ -87,7 +87,7 @@ public ResXDataNode(string name, object value, Func<Type, string> typeNameConver
throw (new ArgumentException(nameof(name)));
}

this.typeNameConverter = typeNameConverter;
this.typeNameConverter = WinformsTypeMappers.InterceptWinformsTypes(typeNameConverter);

Type valueType = (value == null) ? typeof(object) : value.GetType();
if (value != null && !valueType.IsSerializable)
@@ -116,7 +116,7 @@ public ResXDataNode(string name, ResXFileRef fileRef, Func<Type, string> typeNam

this.name = name;
this.fileRef = fileRef ?? throw new ArgumentNullException(nameof(fileRef));
this.typeNameConverter = typeNameConverter;
this.typeNameConverter = WinformsTypeMappers.InterceptWinformsTypes(typeNameConverter);
}

internal ResXDataNode(DataNodeInfo nodeInfo, string basePath)
@@ -864,8 +864,8 @@ internal class AssemblyNamesTypeResolutionService : ITypeResolutionService
private Hashtable cachedAssemblies;
private Hashtable cachedTypes;

private static readonly string s_dotNetPath = Path.Combine(Environment.GetEnvironmentVariable("ProgramFiles"), "dotnet\\shared");
private static readonly string s_dotNetPathX86 = Path.Combine(Environment.GetEnvironmentVariable("ProgramFiles(x86)"), "dotnet\\shared");
private static readonly string s_dotNetPath = Environment.GetEnvironmentVariable("ProgramFiles") != null ? Path.Combine(Environment.GetEnvironmentVariable("ProgramFiles"), "dotnet", "shared") : null;
private static readonly string s_dotNetPathX86 = Environment.GetEnvironmentVariable("ProgramFiles(x86)") != null ? Path.Combine(Environment.GetEnvironmentVariable("ProgramFiles(x86)"), "dotnet", "shared") : null;

internal AssemblyNamesTypeResolutionService(AssemblyName[] names)
{
@@ -956,6 +956,13 @@ public Type GetType(string name, bool throwOnError, bool ignoreCase)
return result;
}

// Replace the WinForms ResXFileRef with the copy in this library
if (name.StartsWith(ResXConstants.ResxFileRef_TypeNameAndAssembly, StringComparison.Ordinal))
{
result = typeof(ResXFileRef);
return result;
}

// Missed in cache, try to resolve the type from the reference assemblies.
if (name.IndexOf(',') != -1)
{
@@ -1047,7 +1054,7 @@ public Type GetType(string name, bool throwOnError, bool ignoreCase)
/// </summary>
private bool IsDotNetAssembly(string assemblyPath)
{
return assemblyPath != null && (assemblyPath.StartsWith(s_dotNetPath, StringComparison.OrdinalIgnoreCase) || assemblyPath.StartsWith(s_dotNetPathX86, StringComparison.OrdinalIgnoreCase));
return assemblyPath != null && s_dotNetPath != null && (assemblyPath.StartsWith(s_dotNetPath, StringComparison.OrdinalIgnoreCase) || assemblyPath.StartsWith(s_dotNetPathX86, StringComparison.OrdinalIgnoreCase));
}

public void ReferenceAssembly(AssemblyName name)
8 changes: 4 additions & 4 deletions System.Resources.NetStandard/ResXResourceWriter.cs
Original file line number Diff line number Diff line change
@@ -102,7 +102,7 @@ public class ResXResourceWriter : IResourceWriter
bool hasBeenSaved;
bool initialized;

private readonly Func<Type, string> typeNameConverter; // no public property to be consistent with ResXDataNode class.
private readonly Func<Type, string> typeNameConverter = WinformsTypeMappers.InterceptWinformsTypes(null); // no public property to be consistent with ResXDataNode class.

/// <summary>
/// Base Path for ResXFileRefs.
@@ -119,7 +119,7 @@ public ResXResourceWriter(string fileName)
public ResXResourceWriter(string fileName, Func<Type, string> typeNameConverter)
{
this.fileName = fileName;
this.typeNameConverter = typeNameConverter;
this.typeNameConverter = WinformsTypeMappers.InterceptWinformsTypes(typeNameConverter);
}

/// <summary>
@@ -132,7 +132,7 @@ public ResXResourceWriter(Stream stream)
public ResXResourceWriter(Stream stream, Func<Type, string> typeNameConverter)
{
this.stream = stream;
this.typeNameConverter = typeNameConverter;
this.typeNameConverter = WinformsTypeMappers.InterceptWinformsTypes(typeNameConverter);
}

/// <summary>
@@ -145,7 +145,7 @@ public ResXResourceWriter(TextWriter textWriter)
public ResXResourceWriter(TextWriter textWriter, Func<Type, string> typeNameConverter)
{
this.textWriter = textWriter;
this.typeNameConverter = typeNameConverter;
this.typeNameConverter = WinformsTypeMappers.InterceptWinformsTypes(typeNameConverter);
}

~ResXResourceWriter()
4 changes: 4 additions & 0 deletions System.Resources.NetStandard/ResxConstants.cs
Original file line number Diff line number Diff line change
@@ -6,5 +6,9 @@ internal class ResXConstants

public static string ResHeaderReaderTypeName => ResHeaderReader.Split(',')[0].Trim();
public static string ResHeaderWriterTypeName => ResHeaderWriter.Split(',')[0].Trim();


public const string ResxFileRefTypeInfo = "System.Resources.ResXFileRef, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
public const string ResxFileRef_TypeNameAndAssembly = "System.Resources.ResXFileRef, System.Windows.Forms";
}
}
26 changes: 26 additions & 0 deletions System.Resources.NetStandard/WinformsTypeMappers.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace System.Resources.NetStandard
{
internal static class WinformsTypeMappers
{
public static Func<Type, string> InterceptWinformsTypes(Func<Type,string> typeNameConverter)
{
return (Type type) =>
{
if (type.AssemblyQualifiedName == typeof(ResXFileRef).AssemblyQualifiedName)
{
return NetStandard.ResXConstants.ResxFileRefTypeInfo;
}
else
{
if (typeNameConverter != null) return typeNameConverter(type);
else return null;
}
};
}

}
}
123 changes: 123 additions & 0 deletions Tests/Example.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit bdad919

Please sign in to comment.