Моя попытка на arch linux:
- Добавил репу multilib в /etc/pacman.conf
- Установил пакеты “wine” и “winetricks”
- winetriсks dotnet48
- Скачал http://pascalabc.net/downloads/PascalABCNETSetup.exe
- wine PascalABCNETSetup.exe
- wine PascalABCNET.exe
GraphABC
и GraphWPF
запускаются без проблем.
Но шрифт по-умолчанию был не моноширный, поэтому поставил ttf-ms-fonts.
Ещё окна подсказок (при наведении мышки, открытии скобок и т.п.) забирают фокус у редактора - то есть не дают писать код пока открыты. Но при этом и сами подсказки не работают, то есть стрелки вниз и вверх не переключают между перегрузками функций и т.п.
Попробовал external
подпрограммы, но получаю BadImageFormatException
что бы не делал. Тестировал с:
uses System;
uses System.Runtime.InteropServices;
{$platformtarget x64}
type
punch_gc_callback = procedure(ptr: IntPtr);
test = static class
//[DllImportAttribute('my_lib')]
static function copy_arr(a: array of integer; punch_gc: punch_gc_callback): IntPtr;
external 'my_lib.so';
end;
begin
test.copy_arr(|1,2,3,4,5|, ptr->
begin
ptr.ToString('X16').Println;
end);
end.
Библиотеку my_lib.so (16.5 КБ) сделал из файла my_lib.c
:
#include <stdlib.h>
#include <string.h>
//__declspec(dllexport)
char * copy_arr(int* a, void (*punch_gc)(void*))
{
char* res = malloc(20); // Выделяем 20 байт неуправляемой памяти
punch_gc(a); // Вызываем ту подпрограмму, чей адрес сюда передали
memcpy(res, a, 20); // Копируем 20 байт из "a" в "res"
return res; // Плохо что неуправляемая память не освобождается, но в этом тесте не важно
}
Командой:
gcc -Wall -g -shared -m64 -o my_lib.so -fPIC my_lib.c
Дальше попробую переключится назад на винду и декомпилить .exe паскаля и рабочий .exe JBRider-а, подключающий ту же библиотеку:
using System.Runtime.InteropServices;
class Program
{
delegate void punch_gc_proc(IntPtr ptr);
[DllImport ("my_lib")]
private static extern IntPtr copy_arr(int[] arr, punch_gc_proc proc);
static void Main()
{
var a = new int[5] {1, 2, 3, 4, 5};
copy_arr(a, ptr =>
{
Console.WriteLine("0x"+ptr.ToString("X16"));
});
}
}
P.S. А, возможно дело в wine, потому что из под wine у меня .dll
библиотека подключается без проблем, а .so
не хочет.
P.P.S. Ну да, если компилить из под wine - получается .exe, зависимый от wine и загружающий только .dll библиотеки. А если компилить консольным компилятором из под mono - .so библиотеки загружаются, но зато не работает IDE паскаля.