Browse Source

fix SD-1594 - Windows Forms designer generates the wrong version of .resx files for .NET 3.5 projects

and convert .resx on project upgrade/downgrade (as noted in a comment on the issue)
pull/6/merge
Siegfried Pammer 14 years ago
parent
commit
b6d2d5a60d
  1. 8
      src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ResourceStore.cs
  2. 4
      src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceList.cs
  3. 1
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  4. 18
      src/Main/Base/Project/Src/Project/Behaviors/DotNetStartBehavior.cs
  5. 85
      src/Main/Base/Project/Src/Project/Behaviors/ResXConverter.cs

8
src/AddIns/DisplayBindings/FormsDesigner/Project/Src/Services/ResourceStore.cs

@ -204,7 +204,7 @@ namespace ICSharpCode.FormsDesigner.Services @@ -204,7 +204,7 @@ namespace ICSharpCode.FormsDesigner.Services
public IResourceWriter GetWriter()
{
this.stream = new MemoryStream();
this.writer = CreateResourceWriter(this.stream, GetResourceType(OpenedFile.FileName));
this.writer = CreateResourceWriter(this.stream, OpenedFile.FileName);
return this.writer;
}
@ -335,12 +335,12 @@ namespace ICSharpCode.FormsDesigner.Services @@ -335,12 +335,12 @@ namespace ICSharpCode.FormsDesigner.Services
return new ResXResourceReader(stream);
}
internal static IResourceWriter CreateResourceWriter(Stream stream, ResourceType type)
internal static IResourceWriter CreateResourceWriter(Stream stream, string fileName)
{
if (type == ResourceType.Resources) {
if (GetResourceType(fileName) == ResourceType.Resources) {
return new ResourceWriter(stream);
}
return new ResXResourceWriter(stream);
return new ResXResourceWriter(stream, t => ResXConverter.ConvertTypeName(t, fileName));
}
internal static ResourceType GetResourceType(string fileName)

4
src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceList.cs

@ -8,9 +8,9 @@ using System.Drawing.Printing; @@ -8,9 +8,9 @@ using System.Drawing.Printing;
using System.IO;
using System.Resources;
using System.Windows.Forms;
using ICSharpCode.Core;
using ICSharpCode.Core.WinForms;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Widgets.ListViewSorting;
namespace ResourceEditor
@ -174,7 +174,7 @@ namespace ResourceEditor @@ -174,7 +174,7 @@ namespace ResourceEditor
// write XML resource
case ".resx":
ResXResourceWriter rxw = new ResXResourceWriter(stream);
ResXResourceWriter rxw = new ResXResourceWriter(stream, t => ResXConverter.ConvertTypeName(t, filename));
foreach (KeyValuePair<string, ResourceItem> entry in resources) {
if (entry.Value != null) {
ResourceItem item = entry.Value;

1
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -345,6 +345,7 @@ @@ -345,6 +345,7 @@
<Compile Include="Src\Project\Behaviors\ProjectBehavior.cs" />
<Compile Include="Src\Project\Behaviors\ProjectBehaviorService.cs" />
<Compile Include="Src\Project\Behaviors\ProjectBehaviorSupportedConditionEvaluator.cs" />
<Compile Include="Src\Project\Behaviors\ResXConverter.cs" />
<Compile Include="Src\Project\BuildEngine.cs" />
<Compile Include="Src\Project\ContextSpecificProperties.cs" />
<Compile Include="Src\Project\Converter\IUpgradableProject.cs" />

18
src/Main/Base/Project/Src/Project/Behaviors/DotNetStartBehavior.cs

@ -9,8 +9,6 @@ using System.Linq; @@ -9,8 +9,6 @@ using System.Linq;
using System.Xml.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Gui.OptionPanels;
using ICSharpCode.SharpDevelop.Project.Converter;
using ICSharpCode.SharpDevelop.Util;
@ -32,11 +30,15 @@ namespace ICSharpCode.SharpDevelop.Project @@ -32,11 +30,15 @@ namespace ICSharpCode.SharpDevelop.Project
}
new protected CompilableProject Project {
get { return (CompilableProject)base.Project; }
}
public override bool IsStartable {
get {
switch (StartAction) {
case StartAction.Project:
return ((CompilableProject)Project).OutputType == OutputType.Exe || ((CompilableProject)Project).OutputType == OutputType.WinExe;
return Project.OutputType == OutputType.Exe || Project.OutputType == OutputType.WinExe;
case StartAction.Program:
return StartProgram.Length > 0;
case StartAction.StartURL:
@ -102,7 +104,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -102,7 +104,7 @@ namespace ICSharpCode.SharpDevelop.Project
public override void ProjectCreationComplete()
{
TargetFramework fx = ((CompilableProject)Project).CurrentTargetFramework;
TargetFramework fx = Project.CurrentTargetFramework;
if (fx != null && (fx.IsBasedOn(TargetFramework.Net35) || fx.IsBasedOn(TargetFramework.Net35Client))) {
AddDotnet35References();
}
@ -139,9 +141,9 @@ namespace ICSharpCode.SharpDevelop.Project @@ -139,9 +141,9 @@ namespace ICSharpCode.SharpDevelop.Project
{
if (!Project.ReadOnly) {
lock (Project.SyncRoot) {
TargetFramework oldFramework = ((CompilableProject)Project).CurrentTargetFramework;
TargetFramework oldFramework = Project.CurrentTargetFramework;
if (newVersion != null && GetAvailableCompilerVersions().Contains(newVersion)) {
((CompilableProject)Project).SetToolsVersion(newVersion.MSBuildVersion.Major + "." + newVersion.MSBuildVersion.Minor);
Project.SetToolsVersion(newVersion.MSBuildVersion.Major + "." + newVersion.MSBuildVersion.Minor);
}
if (newFramework != null) {
UpdateAppConfig(newFramework);
@ -170,6 +172,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -170,6 +172,7 @@ namespace ICSharpCode.SharpDevelop.Project
}
AddOrRemoveExtensions();
Project.Save();
ResXConverter.UpdateResourceFiles(Project);
}
}
}
@ -227,7 +230,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -227,7 +230,7 @@ namespace ICSharpCode.SharpDevelop.Project
{
// When changing the target framework, update any existing app.config
// Also, for applications (not libraries), create an app.config is it is required for the target framework
bool createAppConfig = newFramework.RequiresAppConfigEntry && (((CompilableProject)Project).OutputType != OutputType.Library && ((CompilableProject)Project).OutputType != OutputType.Module);
bool createAppConfig = newFramework.RequiresAppConfigEntry && (Project.OutputType != OutputType.Library && Project.OutputType != OutputType.Module);
string appConfigFileName = CompilableProject.GetAppConfigFile(Project, createAppConfig);
if (appConfigFileName == null)
@ -368,3 +371,4 @@ namespace ICSharpCode.SharpDevelop.Project @@ -368,3 +371,4 @@ namespace ICSharpCode.SharpDevelop.Project
#endregion
}
}

85
src/Main/Base/Project/Src/Project/Behaviors/ResXConverter.cs

@ -0,0 +1,85 @@ @@ -0,0 +1,85 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections;
using System.IO;
using System.Linq;
using System.Resources;
using System.Text;
namespace ICSharpCode.SharpDevelop.Project
{
public static class ResXConverter
{
public static string ConvertTypeName(Type type, string fileName, CompilableProject project = null)
{
Version version;
if (project == null)
version = GetTargetFrameworkVersionFrom(fileName);
else
version = ScanVersion(project.TargetFrameworkVersion);
string name = type.AssemblyQualifiedName;
if (type.Assembly.GlobalAssemblyCache && IsFrameworkAssembly(type.Assembly.GetName().GetPublicKeyToken()))
name = type.AssemblyQualifiedName.Replace(", Version=4.0.0.0,", ", Version=" + PrintVersion(version) + ",");
return name;
}
static readonly Version DotNet40 = new Version(4, 0);
static readonly Version DotNet20 = new Version(2, 0);
static Version GetTargetFrameworkVersionFrom(string fileName)
{
if (ProjectService.OpenSolution == null)
return DotNet40;
var project = ProjectService.OpenSolution.FindProjectContainingFile(fileName) as CompilableProject;
if (project == null)
return DotNet40;
return ScanVersion(project.TargetFrameworkVersion);
}
static Version ScanVersion(string versionString)
{
if (versionString == null)
return DotNet40;
Version version = new Version(versionString.TrimStart('v'));
if (version < DotNet40)
return DotNet20;
return DotNet40;
}
static readonly string[] publicKeys = new[] {
"b77a5c561934e089", "b03f5f7f11d50a3a"
};
static bool IsFrameworkAssembly(byte[] publicKey)
{
string key = publicKey.Aggregate(new StringBuilder(), (sum, part) => sum.AppendFormat("{0:x2}", part)).ToString();
return publicKeys.Contains(key);
}
static string PrintVersion(Version version)
{
return string.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build > 0 ? version.Build : 0, version.Revision > 0 ? version.Revision : 0);
}
/// <summary>
/// Update all .resx in a project.
/// </summary>
public static void UpdateResourceFiles(CompilableProject project)
{
foreach (var resXFile in project.Items.OfType<FileProjectItem>().Where(f => ".resx".Equals(Path.GetExtension(f.FileName), StringComparison.OrdinalIgnoreCase))) {
using (var buffer = new MemoryStream()) {
using (var reader = new ResXResourceReader(resXFile.FileName) { UseResXDataNodes = true })
using (var writer = new ResXResourceWriter(buffer, t => ConvertTypeName(t, resXFile.FileName, project))) {
foreach (DictionaryEntry entry in reader) {
writer.AddResource(entry.Key.ToString(), entry.Value);
}
}
File.WriteAllBytes(resXFile.FileName, buffer.ToArray());
}
}
}
}
}
Loading…
Cancel
Save