Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/56: Рейтинг темы: голосов - 56, средняя оценка - 4.61
2 / 2 / 0
Регистрация: 19.07.2015
Сообщений: 34

Использование DLL написанной на C#

19.07.2015, 19:27. Показов 11425. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В силу обстоятельств требуется использовать функцию из DLL, написанной на C#. Пишу простенький тест - и не работает. Подскажите, пожалуйста, почему.
Тренируюсь на такой простейшей DLL:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace SimpleDll
{
    public class SumCalc
    {
        public static int Sum2Int(int Name, int Pass)
        {
            int Res;
            Res = Name + Pass;
            return Res;
        }
            
    }
}
Откомпилировала, положила рядом с проектом на Delphi. Так же по инструкции переписала пример из учебника, заменив имя функции на свою:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  Tsum = function(Name: integer; Pass: integer): Integer;  stdcall;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c : Integer;
  Sum2Int: Tsum;
  hDLLInst: THandle;
  IsAlive, IsDabcing: Boolean;
begin
  { Загружаем и получаем дескриптор нужного DLL SimpleDLL.dll}
    hDLLInst := LoadLibrary('SimpleDLL.dll');
  { Если загрузка не была успешной, генерируем исключение}
    if (hDLLInst <= 0) then
      raise exception.create('[Неудачный вызов SimpleDLL]');
  { Попытаемся получить адрес функции Sum2Int}
    try
      @Sum2Int := GetProcAddress(hDLLInst, 'Sum2Int');
      if not Assigned(Sum2Int) then
        raise Exception.Create('[Неудачный вызов GetProcessAddress]');
 
      a := 2; b:= 3;
      c := Sum2Int(a,b);
    finally
  { освобождаем дескриптор DLL }
      FreeLibrary(hDLLInst);
      Label1.Caption := IntToStr(c);
  end;
end;
 
end.
Результат - не работает!!! Вызывается исключение [Неудачный вызов GetProcessAddress].
Что не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.07.2015, 19:27
Ответы с готовыми решениями:

вызов dll написанной на с++
Всем доброго дня!!! Ребята помогите пожалуйста не могу получить результат в Delphi из вызываемой dll написанной на с++/ помогите...

Взаимодействие с DLL написанной на CPP
Здравствуй уважажаемый All! Помогите пожайлуста решить такую вот задачу. Есть библиотека написанная на CPP, в ней есть две ф-ции,...

Подгрузка написанной CUDA *.dll в Delphi
Написал библиотеку под cuda на VS10 вот ее код: #include &quot;windows.h&quot; #include &quot;dbgeng.h&quot; #include &lt;stdio.h&gt; #include...

17
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.07.2015, 20:29
.net-либы предназначены для использования в .net-фреймворке
0
2 / 2 / 0
Регистрация: 19.07.2015
Сообщений: 34
19.07.2015, 20:35  [ТС]
mss, спасибо за внимание к проблеме.
Но я совсем начинающий - на Delphi пишу пару месяцев после перерыва, а с# вообще пару раз видела мельком.
Можно поподробнее, что следует из ответа? Я вообще не смогу использовать эту и аналогичную DLL или мне нужно как-то специальным образом ее перекомпилировать (или переписать)?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.07.2015, 20:39
Цитата Сообщение от Conejo Посмотреть сообщение
нужно как-то специальным образом ее перекомпилировать (или переписать)?
Нужно либо переписать (и соотв-но скомпилировать) ,библ-ку в среде Делфи, либо разрабатывать вызывающий ее код в средах net-разработки
1
2 / 2 / 0
Регистрация: 19.07.2015
Сообщений: 34
19.07.2015, 20:40  [ТС]
Понятно... Очень очень жаль...
0
19.07.2015, 20:42

Не по теме:

Как бы ни было жать, но это очень-очень хорошо.

0
19.07.2015, 20:50  [ТС]

Не по теме:

Моя задача не решается средствами Delphi (той версией, которой мы пользуемся). По крайней мере, за разумное время. На Delphi написан основной готовый проект, который переписывать нецелесообразно. А на С# имеется стандартная процедурина под мою мини-задачу, вот и хотелось сделать DLL-ку. Я конечно найду способ сделать как мне нужно - например, запуском внейшей программы и передачей результата через БД, но хотелось красиво и правильно, через DLL

0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.07.2015, 20:52
Цитата Сообщение от Conejo Посмотреть сообщение
имеется стандартная процедурина
И она настолько суперпупермегакрута, что портировать ее в Делфи невозможно ?
0
2 / 2 / 0
Регистрация: 19.07.2015
Сообщений: 34
19.07.2015, 21:02  [ТС]
mss, я не сказала невозможно. Я сказала, что потребуется много времени, которого ни у меня, ни у людей, которых можно об этом попросить, нет.

Не по теме:

Если интересно: требуется сделать авторизацию к БД. Пользователи регистрируются на сайте, для работы с логинами-паролями используются стандартные процедуры .Net Framework. В базе я вижу имя пользователя, хэш и соль от пароля, еще и зашифрованные дополнительно Base64. Кому как конечно, но для меня реализация правильного хэширования пароля на Delphi очень трудозатратна.

0
19.07.2015, 21:06

Не по теме:

Что ж..
Печальна сия история

0
 Аватар для wendstor
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 516
20.07.2015, 19:53
Лучший ответ Сообщение было отмечено Conejo как решение

Решение

смотрите в сторону COM.
Project | Import Type Library и в результате получаем tlb файл из С# dll
а также google в помощь
1
2 / 2 / 0
Регистрация: 19.07.2015
Сообщений: 34
20.07.2015, 21:55  [ТС]
wendstor, Да! Это все-таки возможно, ура! Спасибо.
Мне еще чуть раньше помогли в другом месте. В итоге тестовый пример заработал. Если кому еще будет интересно, вот тут
http://aakinshin.net/ru/blog/d... cs-in-com/
подробное описание что и как делать. Но пример на C# оттуда не рабочий (по крайней мере у меня дельфи класс видел, а функцию в нем - нет). Рабочий код я скопировала откуда-то с другого сайта, уже не помню с какого, переименовала функцию под себя. Тестовая DLL на C# выглядит теперь так:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Runtime;
 
 
namespace CL2
{
    public interface ASignatures
    {
        int Sum2Int(int a, int b);
    }
 
    [Guid("AB634001-F13D-11d0-A459-004095E1DAEA")]// стандартный GUID для IInitDone ссылка [url]http://soaron.fromru.com/vkhints.htm[/url]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IInitDone
    {
        /// <summary>
        /// Инициализация компонента
        /// </summary>
        /// <param name="connection">reference to IDispatch</param>
        void Init(
          [MarshalAs(UnmanagedType.IDispatch)]
    object connection);
 
        /// <summary>
        /// Вызывается перед уничтожением компонента
        /// </summary>
        void Done();
 
        /// <summary>
        /// Возвращается инициализационная информация
        /// </summary>
        /// <param name="info">Component information</param>
        void GetInfo(
          [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]
    ref object[] info);
    }
 
    [ClassInterface(ClassInterfaceType.AutoDual)]
    [ComVisible(true)]
    public class ArsClass : ASignatures, IInitDone
    {
 
        //private IAsyncEvent asyncEvent = null;
        //private IStatusLine statusLine = null;
 
        /// <summary>
        /// Инициализация компонента
        /// </summary>
        /// <param name="connection">reference to IDispatch</param>
        public void Init(
          [MarshalAs(UnmanagedType.IDispatch)]
  object connection)
        {
            //asyncEvent = (IAsyncEvent)connection;
            //statusLine = (IStatusLine)connection;
        }
 
        /// <summary>
        /// Возвращается информация о компоненте
        /// </summary>
        /// <param name="info">Component information</param>
        public void GetInfo(
          [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]
  ref object[] info)
        {
            info[0] = 2000;
        }
 
        public void Done()
        {
        }
 
        public int Sum2Int(int a, int b)
        {
            int c = a + b;
            return c;
        }
    }
}
1
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
20.07.2015, 22:10
Лучший ответ Сообщение было отмечено Conejo как решение

Решение

вот если что https://www.cyberforum.ru/post7674858.html
2
20.07.2015, 22:23

Не по теме:

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

Тогда уж было бы нелишним избавиться хотя бы от необходимости регистрации этого "добра" в реестре, благо tlb якобы вшита в либу

По кр.мере объекты из ocx'ов можно во многих случаях вполне успешно пользовать напрямую, вне зависимости от того зарегистрированы они в реестре или нет

0
2 / 2 / 0
Регистрация: 19.07.2015
Сообщений: 34
20.07.2015, 22:28  [ТС]
Может и ужасно, но если очень хочется...

Не по теме:

Я же писала - алгоритмические манипуляции для меня весьма сложны


Тогда уж было бы нелишним избавиться хотя бы от необходимости регистрации этого "добра" в реестре, благо tlb якобы вшита в либу
Если знаете как и подскажете - буду очень благодарна. В общем, любые подсказки по упрощению и усовершенствованию приветствуются.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
20.07.2015, 22:49
вот, например

или пример на Васике

Где-то у меня был и дельфийский пример, но с ходу не найду - пошаритьься нужно по закромам)
1
2 / 2 / 0
Регистрация: 19.07.2015
Сообщений: 34
20.07.2015, 23:00  [ТС]
mss, Вторая ссылка не работает
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
20.07.2015, 23:02
ну загугли на тему "использование com ocx без регистрации в реестре"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.07.2015, 23:02
Помогаю со студенческими работами здесь

Импорт в Delphi функций из dll, написанной на C++
Здравствуйте! Наверное, многие сталкивались со следующей проблеммой: При попытке в Delphi импортировать функцию из dll, написанной на...

Использование библиотеки, написанной на ассемблере
Я написал библиотеку на ассемблере, которая складывает два числа. Загружаю ее в Delphi и использую функцию из библиотеки. Ввожу значения: 1...

Есть исходник DLL на Delphi как (и возможно ли) написать похожее на VB.NET и использовать в среде программы написанной на Delphi
Суть вопроса вкратце такова - Есть исходник DLL написанной на Delphi Library Extdll; uses SysUtils, Windows; type ...

Вызов программой, написанной на С++, функции из dll, написанной на Assembler (явное подключение dll)
Доброго времени суток!Задали лабораторную работу: программа, написанная на с++ должна подключать dll, написанную на Assembler и вызывать...

Использование dll, написанной на C++ Qt в Delphi
Добрый день, уважаемые форумчане. Работаю в команде разработчиков. Я пишу на С++Qt. Изначально главный разработчик писал программу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru