3

I am trying to build this C# program using MkBundle so that users can run it on Linux without having to install Mono.

But I keep getting an error when trying to use the program that is built.

Steps to reproduce:

  1. Git clone this project:

https://github.com/nddipiazza/Sharepoint-Exporter

  1. Extract the DLL's from this:

https://www.microsoft.com/en-us/download/confirmation.aspx?id=35585 -

  1. In Solution explorer, right click References -> Add reference -> Browse .NET assemblies -> Add the Microsoft sharepoint DLLs

    • Microsoft.SharePoint.Client.dll
    • Microsoft.SharePoint.Client.Runtime.dll
  2. Build the application.

(or alternatively just grab the built application from here https://drive.google.com/a/lucidworks.com/file/d/1GPgkmike9KYTDBGLuNj0R_0Q_FDQdhKr/view?usp=sharing )

  1. Run:

mkbundle --simple --static --deps -o ./SpFetcher bin/Release/SpPrefetchIndexBuilder.exe

Note that the bundle seems to build successfully:

ndipiazza@mate:~/lucidworks/Sharepoint-Exporter/SpCrawler (master)*$ mkbundle --simple --static --deps -o ./SpFetcher bin/Release/SpPrefetchIndexBuilder.exe
Using runtime: /usr/bin/mono
     Assembly: /home/ndipiazza/lucidworks/Sharepoint-Exporter/SpCrawler/bin/Release/SpPrefetchIndexBuilder.exe
       Config: /usr/bin/mono
     Assembly: /usr/lib/mono/4.5/mscorlib.dll
     Assembly: /usr/lib/mono/4.5/System.Net.Http.dll
     Assembly: /usr/lib/mono/4.5/System.dll
     Assembly: /usr/lib/mono/4.5/Mono.Security.dll
     Assembly: /usr/lib/mono/4.5/System.Configuration.dll
     Assembly: /usr/lib/mono/4.5/System.Xml.dll
     Assembly: /usr/lib/mono/4.5/System.Security.dll
     Assembly: /usr/lib/mono/4.5/System.Core.dll
     Assembly: /usr/lib/mono/4.5/Mono.Posix.dll
     Assembly: /usr/lib/mono/4.5/System.Web.Extensions.dll
     Assembly: /usr/lib/mono/4.5/System.Web.dll
     Assembly: /usr/lib/mono/4.5/System.Drawing.dll
     Assembly: /usr/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll
     Assembly: /usr/lib/mono/4.5/System.Data.dll
     Assembly: /usr/lib/mono/4.5/System.Numerics.dll
     Assembly: /usr/lib/mono/4.5/System.Transactions.dll
     Assembly: /usr/lib/mono/4.5/Mono.Data.Tds.dll
     Assembly: /usr/lib/mono/4.5/System.EnterpriseServices.dll
     Assembly: /usr/lib/mono/4.5/System.Web.ApplicationServices.dll
     Assembly: /usr/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll
     Assembly: /usr/lib/mono/4.5/Mono.Data.Sqlite.dll
     Assembly: /usr/lib/mono/4.5/System.Web.Services.dll
     Assembly: /usr/lib/mono/4.5/System.DirectoryServices.dll
     Assembly: /usr/lib/mono/4.5/Novell.Directory.Ldap.dll
     Assembly: /usr/lib/mono/4.5/System.Design.dll
     Assembly: /usr/lib/mono/4.5/System.Windows.Forms.dll
     Assembly: /usr/lib/mono/4.5/Accessibility.dll
     Assembly: /usr/lib/mono/4.5/Mono.WebBrowser.dll
     Assembly: /usr/lib/mono/4.5/System.Data.Linq.dll
     Assembly: /usr/lib/mono/4.5/System.Runtime.Serialization.dll
     Assembly: /usr/lib/mono/4.5/System.ServiceModel.Internals.dll
     Assembly: /usr/lib/mono/4.5/System.ServiceModel.dll
     Assembly: /usr/lib/mono/4.5/System.IdentityModel.dll
     Assembly: /usr/lib/mono/4.5/System.Messaging.dll
     Assembly: /usr/lib/mono/4.5/Mono.Messaging.dll
     Assembly: /usr/lib/mono/4.5/System.Configuration.Install.dll
     Assembly: /usr/lib/mono/4.5/System.IdentityModel.Selectors.dll
     Assembly: /usr/lib/mono/4.5/System.ServiceModel.Activation.dll
     Assembly: /home/ndipiazza/lucidworks/Sharepoint-Exporter/SpCrawler/Microsoft.SharePoint.Client.dll
     Assembly: /home/ndipiazza/lucidworks/Sharepoint-Exporter/SpCrawler/Microsoft.SharePoint.Client.Runtime.dll
     Assembly: /usr/lib/mono/4.5/System.Xml.Linq.dll
     Assembly: /usr/lib/mono/4.5/I18N.West.dll
     Assembly: /usr/lib/mono/4.5/I18N.dll
Generated ./SpFetcher
  1. Now run the ./SpFetcher program

    • On the machine with Mono, it works fine.

    • On a machine without mono, you get this error:

    The URI prefix is not recognized. at System.Net.WebRequest.Create (System.Uri requestUri, System.Boolean useUriBase) [0x000ae] in <50d80b08c1a5449282b22aedf03ce925>:0 at System.Net.WebRequest.Create (System.String requestUriString) [0x00014] in <50d80b08c1a5449282b22aedf03ce925>:0 at Microsoft.SharePoint.Client.SPWebRequestExecutor..ctor (Microsoft.SharePoint.Client.ClientRuntimeContext context, System.String requestUrl) [0x0002e] in :0 at Microsoft.SharePoint.Client.DefaultWebRequestExecutorFactory.CreateWebRequestExecutor (Microsoft.SharePoint.Client.ClientRuntimeContext context, System.String requestUrl) [0x00021] in :0 at Microsoft.SharePoint.Client.ClientContext.GetFormDigestInfoPrivate () [0x0000d] in :0 at Microsoft.SharePoint.Client.ClientContext.EnsureFormDigest () [0x0001f] in :0 at Microsoft.SharePoint.Client.ClientContext.ExecuteQuery () [0x00008] in :0 at SpPrefetchIndexBuilder.SpPrefetchIndexBuilder.getSubWebs (System.String url, System.Collections.Generic.Dictionary`2[TKey,TValue] parentWebDict) [0x00266] in <8afd075a89d9457b827aef736e8e1c09>:0 at SpPrefetchIndexBuilder.SpPrefetchIndexBuilder.Main (System.String[] args) [0x00018] in <8afd075a89d9457b827aef736e8e1c09>:0

That error is not expected.

Does the mkbundle program not work correctly?

The c# program I am trying to mkbundle: https://drive.google.com/a/lucidworks.com/file/d/1GPgkmike9KYTDBGLuNj0R_0Q_FDQdhKr/view?usp=sharing

The mkbundled result: https://drive.google.com/file/d/13kHG-RxSqfMFlE53wCSe9iqfwOzheKUm/view?usp=sharing

UPDATE: I have created a ticket on mkbundle issue tracker. https://bugzilla.xamarin.com/show_bug.cgi?id=60753#bug_status_bottom

Nicholas DiPiazza
  • 10,029
  • 11
  • 83
  • 152
  • 1
    this looks like a versioning problem; what version of mono has the "machine with mono" and what version of mono was used to run mkbundle? – knocte Nov 21 '17 at 06:50
  • Hi @knocte. thanks for the response. I created the bundle using mkbundle, then ran the bundled app on the same machine. so it should be the same version. – Nicholas DiPiazza Nov 27 '17 at 14:50
  • still, what version of mono? and how did you install it on your machine? – knocte Nov 27 '17 at 15:30
  • I'm on Ubuntu 16. Mono JIT compiler version 5.4.1.6 My project is using .NET 4.6.1 Installed mono using http://www.mono-project.com/download/#download-lin I added the repos then I ran `sudo apt-get install mono-devel` – Nicholas DiPiazza Nov 27 '17 at 20:03
  • Can you try another simple program which gets a response from a url? Try to build that and run it and see if it works or not. Also try with and without the Reference to the sharepoint dlls – Tarun Lalwani Dec 06 '17 at 19:32
  • @TarunLalwani on it – Nicholas DiPiazza Dec 06 '17 at 19:46
  • @TarunLalwani that didn't help. But found an answer from the committers - answered below. – Nicholas DiPiazza Jan 02 '18 at 16:18

1 Answers1

0

Got a response from one of the project owners migueldeicaza on the github ticket I created:

This is caused by a missing machine.config file in the bundled executable.

Probably we should make it so that mkbundle ships the machine.config as well, in the meantime use:

mkbundle --simple --deps -o foo a.exe --machine-config /etc/mono/4.5/machine.config And the problem is that without automatic shipping of machine.config, developers will struggle with the cross compiler to find the proper path.

First take a look at the conversation on that ticket I created, then you should know what to change. in my case this works:

MONO_LOG_MASK=asm MONO_LOG_LEVEL=debug mkbundle --simple --static --deps -o ./SpFetcher --config /etc/mono/config --machine-config /etc/mono/4.5/machine.config bin/Release/SpPrefetchIndexBuilder.exe

finally works. i built this against ubuntumate 16, then moved this to a ubuntumate 17 machine with no mono installed, ran it and it passed!

Nicholas DiPiazza
  • 10,029
  • 11
  • 83
  • 152