Laurent,
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.
regards,
- Kenny
Op 21 Dec 2009, om 12:01 heeft Laurent Etiemble het volgende geschreven:
Hello,
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 <psyki...@gmail.com>
Hi,
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:
Hello,
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 <psyki...@gmail.com>
Hi,
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 Resource.nl-BE.resx
and set the thread's CurrentCUlture/CurrentUICulture to nl-BE the
string you requested will be from the Resource.nl-BE.resx 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 nant.build 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
'file:///Library/Frameworks/Mono.framework/Versions/2.4/lib/mono/gac/System.Security/2.0.0.0__b03f5f7f11d50a3a/System.Security.dll'
[mkbundle] Reference added
'file:///Library/Frameworks/Mono.framework/Versions/2.4/lib/mono/gac/Mono.Security/2.0.0.0__0738eb9f132ed756/Mono.Security.dll'
[mkbundle] Getting references for additional libraries
[mkbundle] Reference added
'file:///Users/kclement/Projects/homes/kclement/code/dotnet/Localization/bin/nl-BE/ConsoleApp.resources.dll'
[mkbundle] Reference added
'file:///Users/kclement/Projects/homes/kclement/code/dotnet/Localization/bin/fr-FR/ConsoleApp.resources.dll'
[mkbundle] Reference added
'file:///Users/kclement/Projects/homes/kclement/code/dotnet/Localization/bin/en-US/ConsoleApp.resources.dll'
[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/
2.0.0.0__b77a5c561934e089/System.dll'
[mkbundle] Embedding Assembly '/Library/Frameworks/
Mono.framework/Versions/2.4/lib/mono/gac/System.Configuration/
2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll'
[mkbundle] Embedding Assembly '/Library/Frameworks/
Mono.framework/Versions/2.4/lib/mono/gac/System.Xml/
2.0.0.0__b77a5c561934e089/System.Xml.dll'
[mkbundle] Embedding Assembly '/Library/Frameworks/
Mono.framework/Versions/2.4/lib/mono/gac/System.Security/
2.0.0.0__b03f5f7f11d50a3a/System.Security.dll'
[mkbundle] Embedding Assembly '/Library/Frameworks/
Mono.framework/Versions/2.4/lib/mono/gac/Mono.Security/
2.0.0.0__0738eb9f132ed756/Mono.Security.dll'
[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
............