We use the .NET resource manager to localize our Silverlight application and want to embed the satellite assemblies for the german language ("de") into the XAP file. Therefor, we set the neutral language to "en" and added "de" to the list of supported languages in the csproj file. This works fine, when we build the project locally. If we build the Silverlight solution with MSBuild (TFS), Silverlight will try to fetch the satellite assemblies with HTTP requests from /ClientBin/de/*.dll
instead of taking those files embeded into the XAP (which do exist). Because the webserver returns 404 error codes for the non existent files, Silverlight crashes with an initialization error.
It turned out that if we remove a custom TFS build activity manipulating the assembly info code files, the Silverlight applications works as expected. Strangely, after re-enabling the activity the compiled XAP application still works (verified for two different build definitions working on seperate branches). The custom activity manipulates the assembly attributes AssemblyConfiguration
, AssemblyCompany
, AssemblyProduct
, AssemblyCopyright
, AssemblyTrademark
, AssemblyVersion
, and AssemblyFileVersion
.
Some additional hints:
- The custom activity will change the assembly info files before any compilation is done
- Compiling the manipulated sources with Visual Studio will build a working XAP
- The content of the XAP files (working and not working) is equal (nearly same sizes, no difference in manifest file)
- The resource manager is instantiated using
ResourceManager("Resource", Assembly.GetExecutingAssembly())
My questions are:
- Why does Silverlight try to fetch those satellite assemblies from
/ClientBin/de/
instead of just using those in the XAP file? - What kind of attribute in the assembly info file could cause such a behavior?
- Why does re-enabling the versioning activity not break the XAP again?