Ich stecke mit einem Problem mit Mono Interop in Linux fest. Ich habe eine native Shared Library (gemacht in Lazarus), die ich in einer C#-Assembly verwenden müssen. Die Shared Library wird von einer Mono C# Assemblie auf Windows und auf Linux verwendet.
Die Baugruppe lädt die gemeinsam genutzte Bibliothek zur Laufzeit über DllImport und ruft eine exportierte Funktion auf, die eine Datei erzeugt und eine Zeichenkette mit dem Namen der neuen Datei zurückgibt. Die Funktion in der Shared Library funktioniert gut, aber unter Linux stürzt die Mono-Laufzeit bei Object.__icall_wrapper_mono_marshal_free ab, wenn die Funktion zurückkehrt. Mit Mono unter Windows funktioniert dies problemlos.
Ich habe mehrere Tests durchgeführt, und ich kann sagen, dass die gemeinsam genutzte Bibliothek tatsächlich funktioniert (die neue Datei wird unter dem angegebenen Pfad generiert), aber am Ende stürzt die Laufzeit ab. Es scheint, dass die Laufzeit Probleme mit dem Marshaling der resultierenden Zeichenfolge zurück in die Baugruppe hat, weil es funktioniert, wenn ich eine exportierte Funktion verwenden, die eine int zurückgibt.
Meine gemeinsam genutzte Bibliothek sieht in etwa so aus:
library fileProcessing;
{$mode objfpc}{$H+}
...
function ProcessFile(File, ResultPath: PChar): PChar; cdecl; // returns a null-terminated string, with a C ABI calling convention
var
sFile, sPath, sResult: string;
begin
sFile := StrPas(File);
sPath := StrPas(ResultPath);
...
sResult := GenerateNewFile(sFile, sPath); // helper function that generates the file and returns its filename
Result := stralloc(length(sResult) + 1);
Result := strpcopy(Result, sResult);
end;
...
exports ProcessFile name 'ProcessFile';
Die aufrufende C#-Assembly sieht folgendermaßen aus:
namespace SIG
{
public class TsigKernel
{
...
[DllImport("fileProcessing.so", CharSet=CharSet.Ansi,
EntryPoint="ProcessFile",
CallingConvention=CallingConvention.Cdecl, SetLastError = true)]
private static extern string ex_ProcessFile(string File, string ResultPath);
// managed wrapper for the shared library exported function
public string ProcessFile(string File, string ResultPath)
{
return ex_ProcessFile(File, ResultPath);
}
...
}
}
Ich habe mehrere Alternativen ausprobiert (Rückgabe einer nativen Zeichenfolge aus der exportierten Funktion, Ändern der Aufrufkonvention zu stdcall auf der Assembly und der gemeinsam genutzten Bibliothek, Ändern des Zeichensatzes in der DllImport).
Ich bin sicher, dass ich etwas übersehe, aber ich habe bei Google nichts über dieses Problem gefunden.
Mein Absturz lautet:
=================================================================
Got a SIGABRT while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries
used by your application.
=================================================================
Stacktrace:
at (wrapper managed-to-native) object.__icall_wrapper_mono_marshal_free (intptr) <0x00004>
at (wrapper managed-to-native) object.__icall_wrapper_mono_marshal_free (intptr) <0x00004>
at (wrapper managed-to-native) SIG.TsigKernel.ex_ProcessFile (string, string) <0x00064>
at SIG.TsigKernel.ProcessFile (string, string) <0x00010>
at TEST.Form1.Form1_Load (object,System.EventArgs) <0x00047>
at System.Windows.Forms.Form.OnLoad (System.EventArgs) <0x00060>
at System.Windows.Forms.Form.OnLoadInternal (System.EventArgs) <0x00081>
at System.Windows.Forms.Form.OnCreateControl () <0x00051>
at System.Windows.Forms.Control.CreateControl () <0x0012e>
at System.Windows.Forms.Control.WmShowWindow (System.Windows.Forms.Message&) <0x0010f>
at System.Windows.Forms.Control.WndProc (System.Windows.Forms.Message&) <0x00292>
at System.Windows.Forms.ScrollableControl.WndProc (System.Windows.Forms.Message&) <0x00013>
at System.Windows.Forms.ContainerControl.WndProc (System.Windows.Forms.Message&) <0x00051>
at System.Windows.Forms.Form.WndProc (System.Windows.Forms.Message&) <0x0022a>
at System.Windows.Forms.Control/ControlWindowTarget.OnMessage (System.Windows.Forms.Message&) <0x0001d>
at System.Windows.Forms.Control/ControlNativeWindow.WndProc (System.Windows.Forms.Message&) <0x0002d>
at System.Windows.Forms.NativeWindow.WndProc (intptr,System.Windows.Forms.Msg,intptr,intptr) <0x001eb>
at System.Windows.Forms.XplatUIX11.SendMessage (intptr,System.Windows.Forms.Msg,intptr,intptr) <0x002ae>
at System.Windows.Forms.XplatUIX11.MapWindow (System.Windows.Forms.Hwnd,System.Windows.Forms.WindowType) <0x0019a>
at System.Windows.Forms.XplatUIX11.CreateWindow (System.Windows.Forms.CreateParams) <0x00bb4>
at System.Windows.Forms.XplatUI.CreateWindow (System.Windows.Forms.CreateParams) <0x0001d>
at System.Windows.Forms.NativeWindow.CreateHandle (System.Windows.Forms.CreateParams) <0x00030>
at System.Windows.Forms.Control.CreateHandle () <0x0007f>
at System.Windows.Forms.Form.CreateHandle () <0x00014>
at System.Windows.Forms.Control.CreateControl () <0x0008a>
at System.Windows.Forms.Control.SetVisibleCore (bool) <0x00079>
at System.Windows.Forms.Form.SetVisibleCore (bool) <0x0021d>
at System.Windows.Forms.Control.set_Visible (bool) <0x0002c>
at (wrapper remoting-invoke-with-check) System.Windows.Forms.Control.set_Visible (bool) <0x00057>
at System.Windows.Forms.Application.RunLoop (bool,System.Windows.Forms.ApplicationContext) <0x001f9>
at System.Windows.Forms.Application.Run (System.Windows.Forms.ApplicationContext) <0x00052>
at System.Windows.Forms.Application.Run (System.Windows.Forms.Form) <0x00033>
at TEST.Program.Main () <0x00044>
at (wrapper runtime-invoke) object.runtime_invoke_void (object,intptr,intptr,intptr) <0x0003a>
Native stacktrace:
mono [0x80d36a9]
[0xffffe410]
[0xffffe430]
/lib/libc.so.6(gsignal+0x4f) [0xb76430cf]
/lib/libc.so.6(abort+0x187) [0xb76449e7]
/lib/libc.so.6 [0xb767f4ed]
/lib/libc.so.6 [0xb768550b]
/lib/libc.so.6 [0xb7686de4]
/lib/libc.so.6(cfree+0x6d) [0xb7689fdd]
/usr/lib/libglib-2.0.so.0(g_free+0x36) [0xb780d886]
[0xb6561634]
[0xb5786a5d]
[0xb57869d1]
[0xb57866c8]
[0xb5786599]
[0xb578632a]
[0xb5785f7a]
[0xb605dbe7]
[0xb578c7c0]
[0xb578bbfb]
[0xb57820c4]
[0xb578208a]
[0xb5781eeb]
[0xb578b95e]
[0xb578b936]
[0xb578ac74]
[0xb5788acf]
[0xb578c4b3]
[0xb605eca5]
[0xb605e0e6]
[0xb605e069]
[0xb605ddf0]
[0xb57804bd]
[0xb605db43]
[0xb57938a2]
[0xb57800a6]
[0xb57937f5]
[0xb5793798]
[0xb577f062]
[0xb577ee13]
[0xb577eacc]
[0xb71ce1f5]
[0xb71ce26b]
mono [0x8063552]
Irgendwelche Ideen?