diff --git a/RESW File Code Generator/ReswCodeGen.CustomActions/Properties/AssemblyInfo.cs b/RESW File Code Generator/ReswCodeGen.CustomActions/Properties/AssemblyInfo.cs
index ca40b3d..62d04ca 100644
--- a/RESW File Code Generator/ReswCodeGen.CustomActions/Properties/AssemblyInfo.cs
+++ b/RESW File Code Generator/ReswCodeGen.CustomActions/Properties/AssemblyInfo.cs
@@ -32,4 +32,4 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.2.*")]
+[assembly: AssemblyVersion("1.0.3.*")]
diff --git a/RESW File Code Generator/ReswCodeGen.CustomTool/CodeDomCodeGenerator.cs b/RESW File Code Generator/ReswCodeGen.CustomTool/CodeDomCodeGenerator.cs
index 796ac15..d4dae1e 100644
--- a/RESW File Code Generator/ReswCodeGen.CustomTool/CodeDomCodeGenerator.cs
+++ b/RESW File Code Generator/ReswCodeGen.CustomTool/CodeDomCodeGenerator.cs
@@ -3,6 +3,7 @@ using System.CodeDom;
using System.CodeDom.Compiler;
using System.Globalization;
using System.IO;
+using System.Reflection;
using System.Text;
using Microsoft.CSharp;
@@ -51,11 +52,66 @@ namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool
const string resourceLoaderType = "ResourceLoader";
var resourceLoaderField = new CodeMemberField(resourceLoaderType, "resourceLoader")
{
- Attributes = MemberAttributes.Private | MemberAttributes.Static | MemberAttributes.Final,
- InitExpression = new CodeObjectCreateExpression(resourceLoaderType, new CodePrimitiveExpression(className))
+ Attributes = MemberAttributes.Private | MemberAttributes.Static | MemberAttributes.Final
};
targetClass.Members.Add(resourceLoaderField);
+ var constructor = new CodeTypeConstructor();
+
+ var executingAssemblyVar = new CodeVariableDeclarationStatement(typeof(string), "executingAssemblyName");
+ var executingAssemblyInit = new CodeAssignStatement(
+ new CodeVariableReferenceExpression("executingAssemblyName"),
+ new CodeSnippetExpression("Windows.UI.Xaml.Application.Current.GetType().AssemblyQualifiedName"));
+ var executingAssemblySplit = new CodeVariableDeclarationStatement(typeof(string[]), "executingAssemblySplit");
+ var executingAssemblyInit2 = new CodeAssignStatement(
+ new CodeVariableReferenceExpression("executingAssemblySplit"),
+ new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("executingAssemblyName"), "Split", new CodePrimitiveExpression(',')));
+ var executingAssemblyInit3 = new CodeAssignStatement(
+ new CodeVariableReferenceExpression("executingAssemblyName"),
+ new CodeArrayIndexerExpression(new CodeVariableReferenceExpression("executingAssemblySplit"), new CodePrimitiveExpression(1)));
+
+ var currentAssemblyVar = new CodeVariableDeclarationStatement(typeof(string), "currentAssemblyName");
+ var currentAssemblyInit = new CodeAssignStatement(
+ new CodeVariableReferenceExpression("currentAssemblyName"),
+ new CodePropertyReferenceExpression(new CodeTypeOfExpression(className), "AssemblyQualifiedName"));
+ var currentAssemblySplit = new CodeVariableDeclarationStatement(typeof(string[]), "currentAssemblySplit");
+ var currentAssemblyInit2 = new CodeAssignStatement(
+ new CodeVariableReferenceExpression("currentAssemblySplit"),
+ new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("currentAssemblyName"), "Split", new CodePrimitiveExpression(',')));
+ var currentAssemblyInit3 = new CodeAssignStatement(
+ new CodeVariableReferenceExpression("currentAssemblyName"),
+ new CodeArrayIndexerExpression(new CodeVariableReferenceExpression("currentAssemblySplit"), new CodePrimitiveExpression(1)));
+
+ var createResourceLoader = new CodeConditionStatement(
+ new CodeSnippetExpression("executingAssemblyName.Equals(currentAssemblyName)"),
+ new CodeStatement[] // true
+ {
+ new CodeAssignStatement(
+ new CodeFieldReferenceExpression(null, "resourceLoader"),
+ new CodeObjectCreateExpression(new CodeTypeReference("ResourceLoader")))
+ },
+ new CodeStatement[] // false
+ {
+ new CodeAssignStatement(
+ new CodeFieldReferenceExpression(null, "resourceLoader"),
+ new CodeObjectCreateExpression(new CodeTypeReference("ResourceLoader"),
+ new CodeSnippetExpression("currentAssemblyName + \"/Resources\"")))
+ });
+
+ constructor.Statements.Add(executingAssemblyVar);
+ constructor.Statements.Add(executingAssemblyInit);
+ constructor.Statements.Add(executingAssemblySplit);
+ constructor.Statements.Add(executingAssemblyInit2);
+ constructor.Statements.Add(executingAssemblyInit3);
+ constructor.Statements.Add(currentAssemblyVar);
+ constructor.Statements.Add(currentAssemblyInit);
+ constructor.Statements.Add(currentAssemblySplit);
+ constructor.Statements.Add(currentAssemblyInit2);
+ constructor.Statements.Add(currentAssemblyInit3);
+ constructor.Statements.Add(createResourceLoader);
+
+ targetClass.Members.Add(constructor);
+
var resources = ResourceParser.Parse();
foreach (var item in resources)
{
diff --git a/RESW File Code Generator/ReswCodeGen.CustomTool/Properties/AssemblyInfo.cs b/RESW File Code Generator/ReswCodeGen.CustomTool/Properties/AssemblyInfo.cs
index 5b345cd..ab6cd83 100644
--- a/RESW File Code Generator/ReswCodeGen.CustomTool/Properties/AssemblyInfo.cs
+++ b/RESW File Code Generator/ReswCodeGen.CustomTool/Properties/AssemblyInfo.cs
@@ -32,4 +32,4 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.2.*")]
+[assembly: AssemblyVersion("1.0.3.*")]
diff --git a/RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorTests.cs b/RESW File Code Generator/ReswCodeGen.Tests/CSharpCodeGeneratorTests.cs
similarity index 90%
rename from RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorTests.cs
rename to RESW File Code Generator/ReswCodeGen.Tests/CSharpCodeGeneratorTests.cs
index d247abd..073894a 100644
--- a/RESW File Code Generator/ReswCodeGen.Tests/CodeGeneratorTests.cs
+++ b/RESW File Code Generator/ReswCodeGen.Tests/CSharpCodeGeneratorTests.cs
@@ -6,7 +6,7 @@ namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool.Tests
{
[TestClass]
[DeploymentItem("Resources/Resources.resw")]
- public class CodeGeneratorTests
+ public class CSharpCodeGeneratorTests
{
private string reswFileContents;
private const string FilePath = "Resources.resw";
@@ -55,7 +55,7 @@ namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool.Tests
[TestMethod]
public void ResourceLoaderInitializedWithClassName()
{
- Assert.IsTrue(actual.Contains("new ResourceLoader(\"Resources\");"));
+ Assert.IsTrue(actual.Contains("new ResourceLoader(currentAssemblyName + \"/Resources\");"));
}
}
}
\ No newline at end of file
diff --git a/RESW File Code Generator/ReswCodeGen.Tests/ReswCodeGen.Tests.csproj b/RESW File Code Generator/ReswCodeGen.Tests/ReswCodeGen.Tests.csproj
index 48b41e2..0d352fc 100644
--- a/RESW File Code Generator/ReswCodeGen.Tests/ReswCodeGen.Tests.csproj
+++ b/RESW File Code Generator/ReswCodeGen.Tests/ReswCodeGen.Tests.csproj
@@ -57,10 +57,11 @@
-
+
+
diff --git a/RESW File Code Generator/ReswCodeGen.Tests/VisualBasicCodeGeneratorTests.cs b/RESW File Code Generator/ReswCodeGen.Tests/VisualBasicCodeGeneratorTests.cs
new file mode 100644
index 0000000..2a08d65
--- /dev/null
+++ b/RESW File Code Generator/ReswCodeGen.Tests/VisualBasicCodeGeneratorTests.cs
@@ -0,0 +1,62 @@
+using System.IO;
+using System.Linq;
+using Microsoft.VisualBasic;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace ChristianHelle.DeveloperTools.CodeGenerators.Resw.CustomTool.Tests
+{
+ [TestClass]
+ [DeploymentItem("Resources/Resources.resw")]
+ public class VisualBasicCodeGeneratorTests
+ {
+ private const string FilePath = "Resources.resw";
+ private string actual;
+ private string reswFileContents;
+ private ICodeGenerator target;
+
+ [TestInitialize]
+ public void Initialize()
+ {
+ reswFileContents = File.ReadAllText(FilePath);
+
+ target = new CodeGeneratorFactory().Create(FilePath.Replace(".resw", string.Empty), "TestApp", reswFileContents, new VBCodeProvider());
+ actual = target.GenerateCode();
+ }
+
+ [TestMethod]
+ public void GenerateCodeDoesNotReturnNull()
+ {
+ Assert.IsNotNull(actual);
+ }
+
+ [TestMethod]
+ public void GeneratedCodeContainsPropertiesDefinedInResources()
+ {
+ var resourceItems = target.ResourceParser.Parse();
+
+ foreach (var item in resourceItems.Where(item => !item.Name.Contains(".")))
+ Assert.IsTrue(actual.Contains("Public Shared ReadOnly Property " + item.Name + "() As String"));
+ }
+
+ [TestMethod]
+ public void GeneratedCodePropertiesContainsCommentsSimilarToValuesDefinedInResources()
+ {
+ var resourceItems = target.ResourceParser.Parse();
+
+ foreach (var item in resourceItems.Where(item => !item.Name.Contains(".")))
+ Assert.IsTrue(actual.Contains("Localized resource similar to \"" + item.Value + "\""));
+ }
+
+ [TestMethod]
+ public void ClassNameEqualsFileNameWithoutExtension()
+ {
+ Assert.IsTrue(actual.Contains("Class Resources"));
+ }
+
+ [TestMethod]
+ public void ResourceLoaderInitializedWithClassName()
+ {
+ Assert.IsTrue(actual.Contains("New ResourceLoader(currentAssemblyName + \"/Resources\")"));
+ }
+ }
+}
\ No newline at end of file