In Ubuntu, I am calling a C# executable from C using Mono (v3.2.8) and the embedded Mono runtime. When I call the exe (.NET 4.5) from the command line (ie, mono testFile.exe), it works fine. However, when I run my C test program, it throws a C# exception:
libc at at (wrapper managed-to-native) System.Platform:uname (intptr)
at System.Platform.get_IsMacOS () [0x00000] in <filename unknown>:0
at System.Net.WebRequest.GetSystemWebProxy () [0x00000] in <filename unknown>:0
at System.Net.WebRequest.GetDefaultWebProxy () [0x00000] in <filename unknown>:0
at System.Net.WebRequest.get_DefaultWebProxy () [0x00000] in <filename unknown>:0
at System.Net.GlobalProxySelection.get_Select () [0x00000] in <filename unknown>:0
at System.Net.HttpWebRequest..ctor (System.Uri uri) [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) System.Net.HttpWebRequest:.ctor (System.Uri)
at System.Net.HttpRequestCreator.Create (System.Uri uri) [0x00000] in <filename unknown>:0
at System.Net.WebRequest.Create (System.Uri requestUri) [0x00000] in <filename unknown>:0
at System.Net.WebRequest.Create (System.String requestUriString) [0x00000] in <filename unknown>:0
at MyClass.MainClass.Main (System.String[] args) [0x00000] in <filename unknown>:0
I've narrowed it down to this one line of code:
WebRequest request = WebRequest.Create("http://www.google.com");
Looking through the call stack and the mono source code, I believe the failure is associated with the calling of the native 'uname' function in libc.so (the CheckOS() function, line 50 of mcs/class/System/System/Platform.cs):
if (uname (buf) == 0) {
I think what is happening is that the p/Invoke layer cannot locate libc.so. However, when I make the same call in my executable's Main() function, it executes fine, I am confused why it works in one place but not the other. It is also strange that the exception message is not a DllNotFoundException, but rather this generic "libc" message (though I have confirmed that I get the same message when I try to p/Invoke with a bogus .so).
My C code:
int main(int argc,const char* argv[]) {
MonoDomain* domain=mono_jit_init("testFile.exe");
MonoAssembly* assembly=mono_domain_assembly_open(domain,"testFile.exe");
MonoImage* image=mono_assembly_get_image(assembly);
const char* args[1];
args[0]="testFile.exe";
mono_jit_exec(domain,assembly,1,(char**) args);
}
My C# code:
namespace MyClass {
class MainClass {
public static void Main (string[] args) {
WebRequest request=WebRequest.Create("http://www.google.com");
}
}
}
gcc compile options are:
gcc cTest.c -I/usr/include/mono-2.0 -DREENTRANT -lmono-2.0 -lm -lrt -ldl -lpthread
mono compile options are:
dmcs -out:testFile.exe -platform:anycpu -sdk:4.5 -target:exe -unsafe+ -main:MyClass.MainClass -reference:System,System.Configuration,System.Data,System.ServiceModel,System.Web,System.Xml *.cs
Update:
I used MONO_LOG_LEVEL and MONO_LOG_MASK to trace the .so search sequence and found that the sequence on the successful call was entirely different from the unsuccessful one. So it is searching, just not very well. I then copied my libc.so.6 to the current directory, renamed to libc.so, and then set LD_LIBRARY_PATH to the same location. This gave me success. I am now having my Linux guru look into what can be done to make this solution more 'correct', but at least I have a running program. This may be the same problem as mine (though the solution's not working for me).
The problem is you are missing the dll mapping (mono_config_parse). The following will work with mono 3.x and 4.x embedding and avoid your libc error.
#include <mono/jit/jit.h>
#include <mono/metadata/environment.h>
#include <stdlib.h>
int
main(int argc, char* argv[]) {
MonoDomain *domain;
const char *file;
int retval;
mono_config_parse (NULL);
domain = mono_jit_init ("textFile.exe");
MonoAssembly *assembly;
assembly = mono_domain_assembly_open (domain, "testFile.exe");
mono_jit_exec (domain, assembly, argc, argv);
retval = mono_environment_exitcode_get ();
mono_jit_cleanup (domain);
return retval;
}
Certain features of the runtime like Dll remapping depend on a configuration file, to load the configuration file, just add:
mono_config_parse (NULL);
Which will load the Mono configuration file (typically /etc/mono/config).
http://www.mono-project.com/docs/advanced/embedding
FYI: On Ubuntu 15.04, I am using:
gcc main.c `pkg-config --cflags --libs mono-2`
You can update that of course to grab the mono-sgen vs. the boehm jit.
On OS-X:
gcc main.c -m32 -framework Foundation -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk \
-lmonosgen-2.0 \
-I/Library/Frameworks/Mono.framework/Headers/mono-2.0 \
-L/Library/Frameworks/Mono.framework/Libraries
I've run into this issue as well. What I noticed is that the mkbundle output lists the assemblies which it embeds, and that the System.Net.dll was not included. After adding it manually on the mkbundle command line, it all worked fine.
The command line I'm using now:
mkbundle my.exe --deps --keeptemp --static --config /etc/mono/configlibc --machine-config /etc/mono/4.5/machine.config System.Net.dll -o bssetup.exe
The configlibc file is a modified copy of the default config file in that directory. The modifications were to remove all mapping lines, except the one for libc.
Hope it helps anyone!
Based on your update, it looks like the application is searching for libc.so instead of libc.so.6. You got it working by manually pointing your LD_LIBRARY_PATH to the current folder having the libc.so that you copied.
Suggestion: ask your Linux guru to symlink libc.so to libc.so.6 in your normal search paths for your application to work.
Related
Researched this issue many times but didn't found solution of it. Working with xamarin forms version 5.0.0.2012, on win 10 os (saw many solutions for mac or linux but didn't found any for windows), using PCSC library version 5.0.0. Trying to invoke context.Establish method while debugging on Android 8.0:
public SimpleReader(ISCardContext context, bool releaseContextOnDispose = false)
{
if (context == null)
{
context = (ISCardContext) new SCardContext();
context.Establish(SCardScope.System);
releaseContextOnDispose = true;
}
this._context = context;
this._reader = (ISCardReader) new SCardReader(context);
this._releaseContextOnDispose = releaseContextOnDispose;
this._disconnectReaderOnDispose = true;
}
When, exception occur with message below:
System.DllNotFoundException: libpcsclite.so.1 assembly:<unknown assembly> type:<unknown type> member:(null)
at (wrapper managed-to-native) PCSC.Interop.Linux.LinuxNativeMethods.SCardEstablishContext(intptr,intptr,intptr,intptr&)
at PCSC.Interop.Linux.PCSCliteLinux.EstablishContext (PCSC.SCardScope dwScope, System.IntPtr pvReserved1, System.IntPtr pvReserved2, System.IntPtr& phContext) [0x00006] in C:\Users\danm\src\pcsc-sharp\src\PCSC\Interop\Linux\PCSCliteLinux.cs:39
at PCSC.SCardContext.Establish (PCSC.SCardScope scope) [0x00020] in C:\Users\danm\src\pcsc-sharp\src\PCSC\SCardContext.cs:81
at App1xx.Services.SimpleReader.SimpleReader..ctor (PCSC.ISCardContext context, System.Boolean releaseContextOnDispose) [0x00023] in C:\Users\vzhynkin\source\repos\App1xx\App1xx\App1xx\Services\SimpleReaderLib\SimpleReader.cs:59
at App1xx.Services.SimpleReader.SimpleReader..ctor () [0x00000] in C:\Users\vzhynkin\source\repos\App1xx\App1xx\App1xx\Services\SimpleReaderLib\SimpleReader.cs:70
at App1xx.Services.UaIdRLib.IdCardReader.connect () [0x00002] in C:\Users\vzhynkin\source\repos\App1xx\App1xx\App1xx\Services\UaIdRLib\IdCardReader.cs:371
at App1xx.Views.AboutPage.OnButtonClicked (System.Object sender, System.EventArgs args) [0x0000f] in C:\Users\vzhynkin\source\repos\App1xx\App1xx\App1xx\Views\AboutPage.xaml.cs:22
at Xamarin.Forms.Button.Xamarin.Forms.Internals.IButtonElement.PropagateUpClicked () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Button.cs:187
at Xamarin.Forms.ButtonElement.ElementClicked (Xamarin.Forms.VisualElement visualElement, Xamarin.Forms.Internals.IButtonElement ButtonElementManager) [0x0001f] in D:\a\1\s\Xamarin.Forms.Core\ButtonElement.cs:61
at Xamarin.Forms.Button.SendClicked () [0x00000] in D:\a\1\s\Xamarin.Forms.Core\Button.cs:173
at Xamarin.Forms.Platform.Android.ButtonElementManager.OnClick (Xamarin.Forms.VisualElement element, Xamarin.Forms.IButtonController buttonController, Android.Views.View v) [0x00000] in D:\a\1\s\Xamarin.Forms.Platform.Android\ButtonElementManager.cs:25
at Xamarin.Forms.Platform.Android.FastRenderers.ButtonRenderer.Android.Views.View.IOnClickListener.OnClick (Android.Views.View v) [0x00000] in D:\a\1\s\Xamarin.Forms.Platform.Android\FastRenderers\ButtonRenderer.cs:72
at Android.Views.View+IOnClickListenerInvoker.n_OnClick_Landroid_view_View_ (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_v) [0x00010] in /Users/builder/azdo/_work/278/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-30/mcw/Android.Views.View.cs:2252
at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.68(intptr,intptr,intptr)
Does anyone faced with this issue?
The PCSC library does not appear to explicitly support Android. In my experience, nugets that work with Xamarin.Android have explicit dependencies set for the platform, but this one does not.
The library tries to use P/Invoke wrappers around native code. You can see that there are implementations for a number of operating systems here, but I don't see any references to Android. The stack trace shows that the code is deciding to use the Linux wrapper, which makes sense. It's looking for the libpcsclite.so.1 native "C/C++" library, but it's not finding it. That library has a home page that does not reference Android.
The PCSC nuget docs state:
pcsc-sharp does not contain any device drivers. A PC/SC compliant
reader + driver is mandatory.
That's the libpcsclite.so.1 . Either your Android device doesn't provide it, or if it does, it's not in a location that your Android app can find it. My Android device (running Android 9) does not have that library in any of /system/*lib* directories, which means that at least for my device someone would need to compile that native library for the CPU (usually arm64) for the device. If you can either compile the native code yourself or find someone who has, AND the native code supports the reader on your Android device, then you could get the whole thing to work.
I don't have any experience with PCSC myself - just some experience with Xamarin and native libraries.
I've created automatic Android and iOS UI-Tests for my Xamarin application with the Xamarin UITest framework. When running the tests locally, they work fine, but when running them on the Bitrise CI, the iOS tests run fine, but the Android UI Tests keep failing with the following exception:
StartFirstActivity_WaitForActivity_ExpectButtonToHaveText
SetUp : System.Exception : Timed out waiting for result of ClearAppData2
Stack trace:
at Xamarin.UITest.Shared.Android.Commands.CommandAdbClearAppData.Execute (IProcessRunner processRunner, IAndroidSdkTools androidSdkTools) <0x38b3e90 + 0x0064b> in <filename unknown>:0
at Xamarin.UITest.Shared.Execution.Executor.Execute[TDep1,TDep2] (ICommand2 command) <0x32b6478 + 0x00092> in <filename unknown>:0
at Xamarin.UITest.Shared.Android.LocalAndroidAppLifeCycle.EnsureInstalled (Xamarin.UITest.Shared.Android.ApkFile appApkFile, Xamarin.UITest.Shared.Android.ApkFile testServerApkFile) <0x37418c8 + 0x0017a> in <filename unknown>:0
at Xamarin.UITest.Android.AndroidApp..ctor (IAndroidAppConfiguration appConfiguration) <0x31a15e8 + 0x0047a> in <filename unknown>:0
at Xamarin.UITest.Configuration.AndroidAppConfigurator.StartApp (AppDataMode appDataMode) <0x30b4298 + 0x00063> in <filename unknown>:0
at SightPlayer.Core.Test.AppInitializer.StartApp (Platform platform) <0x30b2448 + 0x000ef> in <filename unknown>:0
at SightPlayer.Core.Test.Tests.BeforeEachTest () <0x30b23f8 + 0x00013> in <filename unknown>:0
at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) <0x30b2208 + 0x00093> in <filename unknown>:0
Android test are running with Xamarin.UITest version 1.3.5. This is important, as there seems to have been a bug until version 1.3.3. I've also tried ignoring failing tests, but then the test-runner fails with other Android tests. Interestingly enough that sometimes individual tests pass.
Has anyone encountered this behaviour before? Do you have any advice on how to fix this?
When decompiling CommandAdbClearAppData (which throws the exception), I see
// ISSUE: reference to a compiler-generated field
string str1 = string.Format("/data/data/{0}/files/calabash_failure.out", (object)executeCAnonStorey0.svr);
// ISSUE: reference to a compiler-generated field
string str2 = string.Format("/data/data/{0}/files/calabash_finished.out", (object)executeCAnonStorey0.svr);
while (DateTime.UtcNow < utcNow + TimeSpan.FromSeconds(10.0))
{
if (func(string.Format("ls {0}", (object)str1)).Output.Trim().Equals(str1))
throw new Exception("Clear app data failed with " + func(string.Format("cat {0}", (object)str1)).Output);
if (func(string.Format("ls {0}", (object)str2)).Output.Trim().Equals(str2) && func(string.Format("cat {0}", (object)str2)).Output.Trim().Equals("SUCCESSFUL"))
return;
}
throw new Exception("Timed out waiting for result of ClearAppData2");
which indicates that the generated file could not be found within ten seconds. Could it be, that the emulator is simply too slow and the emulator takes longer than ten seconds to create those files?
Could it be, that the emulator is simply too slow and the emulator takes longer than ten seconds to create those files?
Yes, that could be the problem.
Do you have any advice on how to fix this?
The latest dev builds of the Xamarin.UITest nuget package have increased that timeout interval from 10 seconds to 60 seconds.
Try Xamarin.UITest 1.3.6.1476-dev or newer.
I solved this issue uploading a unsigned version of the APK to my testing device (same thing for Xamarin Android Player). I had to uncheck the "Sign the .APK file" box from the Android Package Signing option in the project properties. The WaitTimes way didn't work for me.
I think you need to look at some Configuration
If your app is not waiting to launch the test you could implement WaitTimes.
Create a class like this:
public class WaitTimes : IWaitTimes
{
public TimeSpan GestureWaitTimeout
{
get { return TimeSpan.FromMinutes(1); }
}
public TimeSpan WaitForTimeout
{
get { return TimeSpan.FromMinutes(1); }
}
}
Then implement it like this:
_app = ConfigureApp
.Android
.EnableLocalScreenshots()
.ApkFile(apkFile)
.DeviceSerial("###")
.ApiKey("###")
.Debug()
.WaitTimes(new WaitTimes())
.StartApp();
Otherwise you could just wait for a specific element to load, like this:
_app.WaitForElement(c => c.Marked("Login"), "Time out expired", TimeSpan.FromSeconds(15));
var result = _app.Query(c => c.Marked("Login"));
Assert.AreEqual(1,result.Length);
_app.Screenshot("Test passed with success");
Here is some more information about WaitTime and WaitForElement that could be helpful.
Help me to correct this exception, idk what's that. I couldn't find any information about that. What do I need to do?
using System;
using Spire.Doc;
using Spire.Doc.Documents;
namespace TOC
{
class MainClass
{
public static void Main (string[] args)
{
Document document = new Document();
}
}
}
Unhandled Exception:
System.TypeLoadException: Could not load type 'Spire.Doc.Document'
from assembly 'Spire.Doc, Version=5.2.48.3040, Culture=neutral,
PublicKeyToken=663f351905198cb3'.
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeLoadException:
Could not load type 'Spire.Doc.Document' from assembly
'Spire.Doc, Version=5.2.48.3040, Culture=neutral,
PublicKeyToken=663f351905198cb3'.
I tried to create the solution again, then the problem disappeared and appear another one.
Unhandled Exception:
System.InvalidProgramException: Invalid IL code in
Spire.Doc.Document:ᜤ (): IL_0003: pop
at Spire.Doc.Document..ctor () [0x00000] in <filename unknown>:0
at TOC.MainClass.Main (System.String[] args) [0x00001] in
/Users/mac/Documents/Csharp/TOC/Program.cs:11
[ERROR] FATAL UNHANDLED EXCEPTION: System.InvalidProgramException:
Invalid IL code in Spire.Doc.Document:ᜤ (): IL_0003: pop
at Spire.Doc.Document..ctor () [0x00000] in <filename unknown>:0
at TOC.MainClass.Main (System.String[] args) [0x00001] in
/Users/mac/Documents/Csharp/TOC/Program.cs:11
It looks like so weird...
You have to contact Spire.Doc vendor as,
Mono CLR is different from .NET CLR, and therefore the obfuscated assembly optimized for .NET might not work for Mono. They should provide you probably another obfuscated version.
Mono API is not 100% the same as .NET API, so you need the vendor to confirm that they fully test the product against Mono.
Don't simply rely on MoMA for compatibility testing. That's only a prototype and it only provides very basic functionality.
have been working on a project intended for iOS deployment. Until recently, we have been building and deploying to our client via webplayer. However, I am now attempting to shift to releasing builds on iOS . But, no matter what I try, when I go to compile the project I receive the following error messages:
Cross compilation job Mono.WebBrowser.dll failed.
UnityEngine.UnityException: Failed AOT cross compiler: /Applications/Unity_45/Unity.app/Contents/PlaybackEngines/iOSSupport/Tools/OSX/mono-xcompiler --aot=full,asmonly,nodebug,static,outfile="Mono.WebBrowser.dll.s" "Mono.WebBrowser.dll" current dir : /Users/admin/Desktop/UI_gg_current/Temp/StagingArea/Data/Managed
Env: Apple_PubSub_Socket_Render = '/tmp/launch-7SV8Ex/Render'
LOGNAME = 'admin'
PATH = '/usr/bin:/bin:/usr/sbin:/sbin'
TMPDIR = '/var/folders/7c/s32nkpmx0yvgw4mmw_5vhxx40000gn/T/'
MONO_PATH = '/Users/admin/Desktop/UI_gg_current/Temp/StagingArea/Data/Managed'
SSH_AUTH_SOCK = '/tmp/launch-wpdtRI/Listeners'
USER = 'admin'
GC_DONT_GC = 'yes please'
Apple_Ubiquity_Message = '/tmp/launch-cfnoHv/Apple_Ubiquity_Message'
SHELL = '/bin/bash'
__CF_USER_TEXT_ENCODING = '0x1F5:0:0'
GAC_PATH = '/Users/admin/Desktop/UI_gg_current/Temp/StagingArea/Data/Managed'
HOME = '/Users/admin'
COMMAND_MODE = 'unix2003'
result file exists: False. Timed out: False
stdout:
stderr:
at UnityEditor.MonoProcessUtility.RunMonoProcess (System.Diagnostics.Process process, System.String name, System.String resultingFile) [0x00000] in <filename unknown>:0
at UnityEditor.MonoCrossCompile.CrossCompileAOT (BuildTarget target, System.String crossCompilerAbsolutePath, System.String assembliesAbsoluteDirectory, CrossCompileOptions crossCompileOptions, System.String input, System.String output, System.String additionalOptions) [0x00000] in <filename unknown>:0
at UnityEditor.MonoCrossCompile+JobCompileAOT.ThreadPoolCallback (System.Object threadContext) [0x00000] in <filename unknown>:0
UnityEditor.HostView:OnGUI()
and
Error building Player: UnityException: Cross compilation failed.
I am using Unity 4.5. To date I have : deleted third party dlls (including xml.linq.dll) , removed any instance of Lambda search operators (=>), and deleted the temp folder because I have seen these approaches used in similar situations (I know some aspects of Linq are not supported in iOS cross compile).
I have looked at similar issues such as this one: http://answers.unity3d.com/questions/439367/cross-compilation-failed-csharpdll.html. But, I am so perplexed, because it isn't the CSharp assembly causing my problem (which means it isn't one of my scripts?) I am not sure why it would even be including a WebBrowser.dll for an iOS build. Any help is greatly appreciated, as I feel I have searched far and wide for a resolution with no luck.
See the resolution that for this question here.
I'm trying to make an C# program in mono, so i can port it to Windows, Linux and Mac very easy.
But I've got this error:
System.EntryPointNotFoundException has been thrown
CreateActCtx
System.EntryPointNotFoundException: CreateActCtx
at (wrapper managed-to-native) WebKit.NativeMethods:CreateActCtx (WebKit.NativeMethods/ACTCTX&)
at WebKit.ActivationContext.Initialize () [0x00000] in <filename unknown>:0
at WebKit.WebKitBrowser..ctor () [0x00000] in <filename unknown>:0
at (wrapper remoting-invoke-with-check) WebKit.WebKitBrowser:.ctor ()
at TW_Overview.globalVars..cctor () [0x00000] in <filename unknown>:0
Here is some code:
public static void Main (string[] args)
{
Application.Init ();
MainWindow win = new MainWindow ();
startUp();
win.Show ();
Application.Run ();
}
public static globalFunc globalfunctions = new globalFunc();
public static void startUp ()
{
while (!globalfunctions.isLoggedIn()) {
globalfunctions.showLogin();
}
}
And here's the globalfunc (part of it)
public Boolean isLoggedIn()
{
if (globalVars.isLoggedIn == true)
{
return true;
}
return false;
}
The line that give's the error is:
while (!globalfunctions.isLoggedIn()) {
I've gotten this type of approach in C# Windows Visual Studio, and there it worked. So i don't understand why it isn't working.
Hope that you guys have an clue about what the problem is...
EDIT 1
I've downloaded the latest version of webkit.net link, unpacked it and put all the dllś and folders in the debug folder of my program. I also added an refrence to the dll in the debug folder.
And i've added everywhere this line:
using WebKit;
So i don't know what the problem is. mayby something with static and not static??? i'm not that good at that part...
EDIT 2
The problem is that this isn't supported bij Mono.
After some searching and looking if it's possible to port the webkit to mono, i came across an site that already did that for us.
https://live.gnome.org/WebKitGtk
I cant test it right now, but i think it should work. If not, then i will incontinent searching and update here if i find the solution.