Возможно ли создать эквивалент библиотеки на c#?

Есть исходник дополнения к программе SMath Studio: https://smath.info:8443/!/#public/view/head/plugins/NumPlugin

Можно ли каким-то способом создать её аналог на PascalABC.Net? Интересует не полный аналог, а хотя бы работающая часть по поиску функций в сборке.

В пустом документе напишите букву l и нажмите Shift+Space.

Вот только зачем аналог делать? Библиотеки написанные на C# можно подключать к паскалю. И обратное тоже работает.

Смешно.

Я имел в виду:

  • как реализовать интерфейс, находящийся в другой библиотеке, написанной на c#;
  • как в управляемом (managed) паскале реализованы ключевые слова out и ref в параметрах метода;
  • насколько полно реализована поддержка Linq (можно ли написать собственное расширение);
  • есть ли автосвойства;

Задача: написать дополнение к математической программе на управляемом паскале.

Так же как и любой другой, наледуйте от него.


Здесь весь паскаль .Net, а значит весь управляемый.

Как реализовать:

  • ref - через var-параметры.
  • out - тоже через них попробуйте, но даже если прокатит - защиты от дурака вроде "out переменной надо присвоить значение до выхода из метода" вы не получите.

function MyMethod<T>(self: IEnumerable<T>): sequence of T; extensionmethod;//sequence of T это синоним IEnumerable<T>
begin
  yield self.First;
  yield sequence self.Where(
    o->
    o<>default(T)
  );
end;

И обычные, и авто:

type
  t1=class
    
    function get_for_p1: byte := 0;
    procedure set_for_p1(b: byte) := writeln(b);
    
    property p1: byte read get_for_p1 write set_for_p1;//старомодное свойство
    
    property p2: byte read 0 write writeln(value);//расширенное
    
    auto property p3: byte;//авто свойство
    
  end;

А перед тем как задавать следующие вопросы - прочтите справку. Она слабенькая, но вы хотя бы о синтаксисе классов, наследования и т.п. прочтите, чтоб понимать что вообще происходит.

Спасибо, уже лучше. Кое-что нашёл в справке. Наверное может и получиться. Буду пробовать.

А как указать полный путь к сборке? Что-то пока не получается:

{$reference C:\Program Files (x86)\SMath Studio\SMath.Controls.dll}

а так сборка не найдена (хотя она есть):

{$reference (C:\Program Files (x86)\SMath Studio\SMath.Controls.dll)}

.dll должна всегда быть в папке с исходниками. Иначе даже если бы скомпилировалось - .exe не запустился бы, ибо не нашёл бы .dll . Но ошибка странная да…

Такой вот каменный цветок. Собралось, осталось испытать. Моя первая программа на управляемом паскале.

library MyPlugin;

{$reference SMath.Controls.dll} 
{$reference SMath.Manager.dll} 
{$reference SMath.Math.Numeric.dll} 
{$reference SMath.Math.Symbolic.dll} 

interface

uses System, System.Collections.Generic;
uses SMath.Manager, SMath.Math, SMath.Math.Numeric;  

type 
  Plugin = class( IPluginMathNumericEvaluation )
  public
    procedure Initialize();
    procedure Dispose();
    function GetTermsHandled( sessionProfile: SMath.Manager.SessionProfile ): array of TermInfo;    
    function NumericEvaluation( value: Term; args: array of TNumber; var res: TNumber ): boolean;
  end;

implementation

function Plugin.GetTermsHandled( sessionProfile: SMath.Manager.SessionProfile ): array of TermInfo;
begin
  Result := new TermInfo[0];
end;

function Plugin.NumericEvaluation( value: Term; args: array of TNumber; var res: TNumber ): boolean;
begin
  Result := False;
end;

procedure Plugin.Initialize();
begin
end;

procedure Plugin.Dispose();
begin
end;
  
begin
end.

Вообще не обязательно реализовывать все методы, особенно пустые, в implementation. К примеру лучше в самом классе так написать:

    procedure Dispose; begin end;

Или ещё лучше:

    procedure Dispose := exit;

На самом деле это пока заготовки. Теперь нужно численную функцию определить и проверить её работу в математической программе.

А как насчёт переменного количества параметров? Такое вот:

private void Log( string format, params object[] list )
{
    var text = string.Format( format, list );

    var now = DateTime.Now;

    var time = now.ToLongTimeString();
    var date = now.ToShortDateString();

    text = string.Format( "{0} {1} {2}{3}", date, time, text, Environment.NewLine );

    try
    {
        File.AppendAllText( LogFile, text, Encoding.UTF8 );
    }
    catch { }
}

Точно так же, через params.

Компилируется, спасибо. А что насчёт атрибутов?

[assembly: Guid( "ddc09821-49f1-4c21-a829-6499de0a8f06" )]

К сожалению, SMath Studio похоже не признала в сборке что-то похожее на свой плагин. Уточню у автора почему.

Атрибуты работают и с абсолютно тем же синтаксисом как в C#. Но я в них сильно не разбираюсь, так что мало что вам подскажу.

Да, что-то не получилось добавить. Это нужно для явного задания guid в тексте программы. Иначе его потом доставать нужно, если в метаданных указывается именно этот атрибут. Дело в том, что работа с плагинами в SMath Studio идёт через эти идентификаторы и лучше его знать и определять в явном виде.

В общем, довольно неплохо для такой небольшой среды разработки. Я впечатлён.

П.С. Хотя ограничение можно обойти, если оформить сборки в виде “вторичных” плагинов. Написать основной менеджер в виде плагина на c#, который будет подгружать паскалевские сборки. Это идея.

Давайте конкретнее, что именно и где не получилось.

Я не знаю где вставлять объявление атрибута. Нужен аналог их списка по такому образцу:

using System.Reflection;
using System.Runtime.InteropServices;

[assembly: AssemblyTitle( "MyPlugin" )]
[assembly: AssemblyDescription( "MyPlugin" )]
[assembly: AssemblyProduct( "MyPlugin" )]
[assembly: AssemblyCopyright( "Copyright © 2019" )]

[assembly: Guid( "ddc09821-49f1-4c21-a829-6499de0a8f06" )]
[assembly: AssemblyVersion( "0.2.*" )]

Попробовал после секции implementation, но на Guid поругался, сказав, что это не атрибут.

Ещё такой вопрос. Ведь у .Net сборки вроде бы как нет точки входа. Обязателен ли begin и end в конце? Когда он будет срабатывать? Или получаемая сборка похожа на C++/CLI? Т.е. она не чисто управляемая?

Так так, kernel32.dll в зависимостях. Поэтому, видимо, SMath Studio эту сборку и проигнорировала. Может и неуправляемые указатели работают?

П.С. Посмотрел на репозиторий тов. Брыкина. Очень впечатляет. Неуправляемые указатели, судя по всему, поддерживаются. Это интересно.

А, такое можно через директивы. Это есть в справке.

begin не обязателен, можно поставить просто end. в самом конце.