[Mono-dev] mkbundle --cross

dmaxime dmaxime at libero.it
Thu Jun 29 15:11:45 UTC 2017


Hi, David,
I followed your advice and now my program runs fine on mac but I found 
other issues I would like to point out to you::

If there are dlls with the same name in the current folder, mkbundle 
ignores the path on the command line (look path of System.dll):

$ mkbundle --deps --static --cross mono-5.0.1-osx-10.7-i386.zip -o 
launcher-mac CHElauncher.exe 
/home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/System.dll
From: /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip
Using runtime: /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/bin/mono
      Assembly: /home/jak/mac/CHElauncher
      Assembly: /home/jak/mac/System.dll
      Assembly: 
/home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.West.dll
      Assembly: 
/home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.dll
Generated launcher-mac

(now I remove local file System.dll)

$ rm System.dll

$ mkbundle --deps --static --cross mono-5.0.1-osx-10.7-i386.zip -o 
launcher-mac CHElauncher.exe 
/home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/System.dll
From: /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip
Using runtime: /home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/bin/mono
      Assembly: /home/jak/mac/CHElauncher
      Assembly: 
/home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/System.dll
      Assembly: 
/home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.West.dll
      Assembly: 
/home/jak/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.dll
Generated launcher-mac

Also, I've looked at mkbundle source code on 
https://github.com/mono/mono/blob/master/mcs/tools/mkbundle/mkbundle.cs. 
I do not have the ability to use debugging tools on it, but it seems 
that in the QueueAssembly function, the first time recursively called, 
the first if is satisfied, so it ends up returning true, true again and 
stops its work. To follow, I send you the piece of code that I used to 
find out about the dependencies of my program. It is not recursive and 
seems to do its job properly. I've grubbed it here: 
https://stackoverflow.com/questions/851248/c-sharp-reflection-get-all-active-assemblies-in-a-solution 
.

         staticintMain(string[]args)
{
List<string>ass_name=newList<string>();

try
{
foreach(var e inGetAssemblies(@args[0]))
ass_name.Add(e.GetName().Name);

foreach(var e inass_name)
Console.WriteLine(e);
}
catch(Exception e)
{
Console.WriteLine("Anexceptionoccurred:{0}",e.Message);
return1;
}
return0;
}

publicstaticIEnumerable<Assembly>GetAssemblies(stringfname)
{
varlist=newList<string>();
varstack=newStack<Assembly>();
Assemblyasm=null;
stack.Push(Assembly.LoadFile(fname));

do
{
asm=stack.Pop();

yieldreturnasm;

foreach(var reference inasm.GetReferencedAssemblies())
{
if(!list.Contains(reference.FullName))
{
stack.Push(Assembly.Load(reference));
list.Add(reference.FullName);
}
}
}
while(stack.Count>0);
}

I noticed another thing in mkbundle source code: the VerifySdk function 
verifies the presence of the runtime in sdk_path/bin/mono but in the 
windows environment there is no file called 'mono' in the folder, there 
is only mono.exe

Thank you again for your attention.
Greetings.

Il 27/06/2017 14:06, David Curylo ha scritto:
> You need to also add System.dll to the command line, and you’ll find 
> that you have to add all of those other libraries, as well as possibly 
> a few other that are under /usr/lib/mono/4.5/Facades if you use things 
> like from those libraries like TaskExtensions from 
> System.Threading.Tasks.dll.  According to the docs, --deps is supposed 
> to discover those, but I’ve never been able to get it to find them 
> even though things are directly referenced (not loading by reflection 
> or anything).
>
> I think you also need the --static flag to embed the mono runtime 
> libraries.
>
>> On Jun 27, 2017, at 5:27 AM, dmaxime via Mono-devel-list 
>> <mono-devel-list at lists.dot.net 
>> <mailto:mono-devel-list at lists.dot.net>> wrote:
>>
>> Hello everybody,
>> I would like to build a 'all in one' OSX program from linux (ubuntu).
>>
>> This is the linux version I'm using:
>> Linux  4.4.0-81-generic #104-Ubuntu SMP Wed Jun 14 08:17:06 UTC 2017 
>> x86_64 x86_64 x86_64 GNU/Linux
>>
>> This and the Mono version installed:
>> Mono JIT compiler version 5.0.1.1 (2017-02/5077205 Thu May 25 
>> 09:16:53 UTC 2017)
>> Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. 
>> www.mono-project.com
>>     TLS:           __thread
>>     SIGSEGV:       altstack
>>     Notifications: epoll
>>     Architecture:  amd64
>>     Disabled:      none
>>     Misc:          softdebug
>>     LLVM:          supported, not enabled.
>>     GC:            sgen (concurrent by default)
>>
>> These are the necessary frameworks to run my program:
>>     Microsoft.CSharp.dll
>>     System.Configuration.dll
>>     System.Data.DataSetExtensions.dll
>>     System.Data.dll
>>     System.Deployment.dll
>>     System.dll
>>     System.Drawing.dll
>>     System.IO.Compression.dll
>>     System.IO.Compression.FileSystem.dll
>> System.Net <http://system.net>.Http.dll
>>     System.Runtime.Serialization.dll
>>     System.Web.dll
>>     System.Web.Extensions.dll
>>     System.Windows.Forms.dll
>>     System.Xml.dll
>>     System.Xml.Linq.dll
>>
>> I took the following environments using the command "mkbundle 
>> --fetch-target":
>> mono-5.0.1-osx-10.7-i386.zip
>>
>> I ran the build, using mkbundle, with the following command:
>> $ mkbundle --deps --cross mono-5.0.1-osx-10.7-i386.zip -o 
>> launcher-mac CHElauncher.exe
>>
>> And this is the resulting output:
>> From: ~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip
>> Using runtime: ~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/bin/mono
>>     Assembly: ~/mac/CHElauncher.exe
>>     Assembly: 
>> ~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.West.dll
>>     Assembly: 
>> ~/.mono/targets/mono-5.0.1-osx-10.7-i386.zip/lib/mono/4.5/I18N.dll
>> Generated launcher-mac
>>
>> Note that my program runs fine in windows, linux and mac environments 
>> but when I move the resulting file from the build to the mac pc, 
>> where no mono environment is installed, and run it, I get the 
>> following error:
>> $ ./CHElauncher.exe
>> The assembly mscorlib.dll was not found or could not be loaded.
>> It should have been installed in the 
>> `/Library/Frameworks/Mono.framework/Versions/5.0.1/lib/mono/4.5/mscorlib.dll' 
>> directory.
>>
>>
>> I also tried to add mscorlib.dll to the command line mkbundle and I 
>> received this error:
>>
>> Unhandled Exception:
>> System.IO.FileNotFoundException: Could not load file or assembly 
>> 'System, Version=4.0.0.0, Culture=neutral, 
>> PublicKeyToken=b77a5c561934e089' or one of its dependencies.
>> File name: 'System, Version=4.0.0.0, Culture=neutral, 
>> PublicKeyToken=b77a5c561934e089'
>> [ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: 
>> Could not load file or assembly 'System, Version=4.0.0.0, 
>> Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its 
>> dependencies.
>> File name: 'System, Version=4.0.0.0, Culture=neutral, 
>> PublicKeyToken=b77a5c561934e089'
>>
>> Could you explain to me what I'm wrong?
>>
>> Thanks in advance for your attention.
>>
>>
>> _______________________________________________
>> Mono-devel-list mailing list
>> Mono-devel-list at lists.dot.net <mailto:Mono-devel-list at lists.dot.net>
>> http://lists.dot.net/mailman/listinfo/mono-devel-list
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.dot.net/pipermail/mono-devel-list/attachments/20170629/b102d2cc/attachment-0001.html>


More information about the Mono-devel-list mailing list