Новый улучшенный способ установки PascalABC.NET под linux

Моя попытка на arch linux:

  1. Добавил репу multilib в /etc/pacman.conf
  2. Установил пакеты “wine” и “winetricks”
  3. winetriсks dotnet48
  4. Скачал http://pascalabc.net/downloads/PascalABCNETSetup.exe
  5. wine PascalABCNETSetup.exe
  6. wine PascalABCNET.exe

GraphABC и GraphWPF запускаются без проблем.

Но шрифт по-умолчанию был не моноширный, поэтому поставил ttf-ms-fonts.

Screenshot from 2022-02-19 12-03-31

Ещё окна подсказок (при наведении мышки, открытии скобок и т.п.) забирают фокус у редактора - то есть не дают писать код пока открыты. Но при этом и сами подсказки не работают, то есть стрелки вниз и вверх не переключают между перегрузками функций и т.п.


Попробовал 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 паскаля.

2 лайка