greetings,
i think i found a bug in CompilerBase::GetFormNamespace(). the bug occurs
when you use a resx file that has no corresponding .cs file (ie, if i had a
Transform.resx in my project, but no Transform.cs). GetFormNamespace()
tries to open the corresponding source file using File.OpenText(), but in
the given case the call fails resulting in a FileNotFoundException being
thrown. This kills the build.
attached is a modification to the function that wraps the call in a try /
catch / finally and returns "" if no corresponding file can be found. this
fits with the existing behavior, from what i can tell.
thanks,
--b
protected virtual string GetFormNamespace(string resxPath){
// Determine Extension for compiler type
string extension = GetExtension();
string retnamespace = "";
// open matching source file if it exists
string sourceFile = resxPath.Replace( "resx", extension );
StreamReader sr=null;
try {
sr = File.OpenText( sourceFile );
while ( sr.Peek() > -1 ) {
string str = sr.ReadLine();
string matchnamespace = @"namespace ((\w+.)*)";
string matchnamespaceCaps = @"Namespace ((\w+.)*)";
Regex matchNamespaceRE = new Regex(matchnamespace);
Regex matchNamespaceCapsRE = new Regex(matchnamespaceCaps);
if (matchNamespaceRE.Match(str).Success ){
Match namematch = matchNamespaceRE.Match(str);
retnamespace = namematch.Groups[1].Value;
retnamespace = retnamespace.Replace( "{", "" );
retnamespace = retnamespace.Trim();
break;
}
else if (matchNamespaceCapsRE.Match(str).Success ) {
Match namematch = matchNamespaceCapsRE.Match(str);
retnamespace = namematch.Groups[1].Value;
retnamespace = retnamespace.Trim();
break;
}
}
}catch(System.IO.FileNotFoundException) { // if no matching file, dump out
return "";
}finally {
if(sr != null)
sr.Close();
}
return retnamespace;
}