Вот решение, которое не требует изменений, так как оно генерирует сборку с именем App_GlobalResources.dll
со всеми вложенными ресурсами, как ожидают тесты.
Просто вызовите его из метода, отмеченногоатрибут AssemblyInitialize
, и он будет запущен только один раз перед началом всех тестов:
public static void GenerateResourceAssembly()
{
var testExecutionFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var solutionRootPath = "PATH_TO_YOUR_SOLUTION_ROOT";
//Somewhere similar to C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin
var pathResgen = "PATH_TO_RESGEN.EXE";
//You may need to adjust to the path where your global resources are
var globalResourcesPath = Path.Combine(solutionRootPath, @"Web\App_GlobalResources");
var parameters = new CompilerParameters
{
GenerateExecutable = false,
OutputAssembly = "App_GlobalResources.dll"
};
foreach (var pathResx in Directory.EnumerateFiles(globalResourcesPath, "*.resx"))
{
var resxFileInfo = new FileInfo(pathResx);
var filename = resxFileInfo.Name.Replace(".resx", ".resources");
var pathResources = Path.Combine(testExecutionFolder, "Resources." + filename);
var startInfo = new ProcessStartInfo
{
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
FileName = Path.Combine(pathResgen, "resgen.exe"),
Arguments = string.Format("\"{0}\" \"{1}\"", pathResx, pathResources)
};
using (var resgen = Process.Start(startInfo))
{
resgen.WaitForExit();
}
parameters.EmbeddedResources.Add(pathResources);
}
CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(parameters);
}