I don't think that is the case.
Mono can deal with multiple cultures of an assembly.
My test app works without any issues, as long as I don't mkbundle it.

The problem is that mkbundle refuses to bundle 2 resource dlls (it doesn't see the difference between the 2 ==> embedding 2 identical assemblies is impossible).

My guess is that the resourceManager internally uses reflection to load assemblies that are exactly the same. It differentiates between them based on the subdirectory they're in (the compiler places them in nl-BE, fr-FR, en-US, ... subfolders). I think that, in Mono, or even the original .NET Framework, there are never 2 resources dlls with different cultures loaded simultaneously either.

The problem seems to be that mkbundle hard-links these assemblies, and simply does not know how to differentiate between the satellite assemblies, because the only difference is the subfolder they're in.

Therefor, I don't know whether this is in fact, a bug, or just a 'limitation' of mkbundle.


- Kenny

Op 21 Dec 2009, om 12:01 heeft Laurent Etiemble het volgende geschreven:


I came to the same conclusion after some testing. I thought that there was something missing in Monobjc, but it appears that there is huge limitation in the embedding API of the Mono runtime.

In the "mono/metadata/assembly.c", the "mono_assembly_open_from_bundle" is responsible for loading requested assembly. But the lookup does not handle the culture of the assembly. This is why, only one resources dll can be loaded at a time.

I guess I need to produce another patch for Mono, in order to handle the satellite assemblies loading.

Regards, Laurent Etiemble.

2009/12/21 Kenny Clement <>

As you said it might've been caused by MonobjC, I just tested some more, to see if I could rule out MonobjC/determine for sure it was MonobjC.

So, I compiled my application using Visual Studio.
And did mkbundle manually on the commandline (instead of using the MonobjC NAnt task).

So I didn't use MonobjC at all, and I'm still getting the same problem.

It seems this is a limitation of mkbundle.
And I can see why, it can't possibly know which assembly to use, because the namespaces, classname, ... is exactly the same
However, I kind of need this to work.
Is there another way to do what I'm doing? Some sort of workaround?
Other people must've encountered this before.

Now that I know it's not MonobjC related, I'll look around to see if there's a mailing list that is better suited for this kind of question.

Thanks for the reply, and for looking into it!

Btw, we've switched to the latest version of MonobjC, and are testing with your patched Mono version (which indeed fixes the SL crashes and the bundled machine.config) The application is pretty complex (compared to the other MonobjC projects I've seen so far) and is currently being tested. So far, it looks pretty good, we'll let you know if we encounter any problems.

Keep up the good work.

- Kenny

Op 19 Dec 2009, om 11:03 heeft Laurent Etiemble het volgende geschreven:


I think this is a Monobjc issue, because the name of the satellite assemblies is mis-generated during the assembly phase. I have already make some corrections to handle assembly name with space, but I have missed the satellite case.

I will try to give it a try this week-end.

Regards, Laurent Etiemble.

2009/12/18 Kenny Clement <>

I'm not too sure this belongs on the MonobjC mailing list, as this seems more of a problem/shortcoming in mkbundle, but I am using the NAnt.Monobjc tasks, so,
and I am looking for a solution for my MonobjC app, so here goes:

One of the more standard ways of localizing Applications, is by using resource files (.resx) for getting strings out of it.
Let's say we have an application that uses strings from Resource.resx
If you then copy Resource.resx to
and set the thread's CurrentCUlture/CurrentUICulture to nl-BE the string you requested will be from the file.

If Visual studio, or even Mono compiles this, it creates 'Satellite assemblies': 1 for each language you have the resx file in.
I assume .NET then automagically loads these through Reflection.

This works with Mono.
However, when I deploy to my customers, I don't want them to install the (patched) Mono Framework, I use mkbundle.

However, with mkBundle, it seems to be impossible to include more than 1 of these satellite assemblies.
As I need (currently) 3 languages, this is a bit of a problem.

I've created a sample application to show the problem a little clearer. It's a console application, that requests you what culture you want to load, and then displays a localized string from the resource file.

There's a file in the sample, with 3 targets:
clean (cleans up the ./bin and ./dist folder)
build (builds the app in ./bin)
bundle (builds the app in ./bin + uses mkbundle to create a bundle in ./dist)

nant clean build
 - works as expected. execute the app with
mono bin/ConsoleApp.exe

nant clean bundle
- Does not work in the current version, gives the output you can see below. To make it work, you can comment 2 lines, as described in the file, but then you will only support 1 language

Is this a bug?
Is this simply impossible?
Is there some sort of workaround available?

Thanks in advance,

- Kenny

mkbundle output:

 [mkbundle]   Reference added 
 [mkbundle]   Reference added 
 [mkbundle] Getting references for additional libraries
 [mkbundle]   Reference added 
 [mkbundle]   Reference added 
 [mkbundle]   Reference added 
 [mkbundle] Generating native sources...
[mkbundle] Embedding Assembly '/Users/kclement/Projects/homes/ kclement/code/dotnet/Localization/bin/ConsoleApp.exe' [mkbundle] Embedding Assembly '/Library/Frameworks/ Mono.framework/Versions/2.4/lib/mono/2.0/mscorlib.dll' [mkbundle] Embedding Assembly '/Library/Frameworks/ Mono.framework/Versions/2.4/lib/mono/gac/System/' [mkbundle] Embedding Assembly '/Library/Frameworks/ Mono.framework/Versions/2.4/lib/mono/gac/System.Configuration/' [mkbundle] Embedding Assembly '/Library/Frameworks/ Mono.framework/Versions/2.4/lib/mono/gac/System.Xml/' [mkbundle] Embedding Assembly '/Library/Frameworks/ Mono.framework/Versions/2.4/lib/mono/gac/System.Security/' [mkbundle] Embedding Assembly '/Library/Frameworks/ Mono.framework/Versions/2.4/lib/mono/gac/Mono.Security/' [mkbundle] Embedding Assembly '/Users/kclement/Projects/homes/ kclement/code/dotnet/Localization/bin/nl-BE/ConsoleApp.resources.dll' [mkbundle] Embedding Assembly '/Users/kclement/Projects/homes/ kclement/code/dotnet/Localization/bin/fr-FR/ConsoleApp.resources.dll' [mkbundle] Embedding Assembly '/Users/kclement/Projects/homes/ kclement/code/dotnet/Localization/bin/en-US/ConsoleApp.resources.dll'
 [mkbundle] Source generation done in 14.67 seconds
 [mkbundle] Compiling native sources...
[mkbundle] /Users/kclement/Projects/homes/kclement/code/dotnet/ Localization/dist/ConsoleApp.s:6012998:FATAL:Symbol _assembly_data_ConsoleApp_resources_dll already defined. [mkbundle] /Users/kclement/Projects/homes/kclement/code/dotnet/ Localization/dist/ConsoleApp.c:22: error: redefinition of 'assembly_bundle_ConsoleApp_resources_dll' [mkbundle] /Users/kclement/Projects/homes/kclement/code/dotnet/ Localization/dist/ConsoleApp.c:20: error: previous definition of 'assembly_bundle_ConsoleApp_resources_dll' was here [mkbundle] /Users/kclement/Projects/homes/kclement/code/dotnet/ Localization/dist/ConsoleApp.c:24: error: redefinition of 'assembly_bundle_ConsoleApp_resources_dll' [mkbundle] /Users/kclement/Projects/homes/kclement/code/dotnet/ Localization/dist/ConsoleApp.c:22: error: previous definition of 'assembly_bundle_ConsoleApp_resources_dll' was here
 [mkbundle] Compilation done in 8.41 seconds
 [mkbundle] Collecting native libraries

Reply via email to