avianrand Ответов: 2

Как использовать библиотеку DLL, которую я создал в VB.NET в приложении delphi


Я создал довольно простую библиотеку dll в vb.net-да. Я успешно зарегистрировал его (от имени администратора) и можете вызвать его из кнопку в простой vb.net приложения WinForms приложение, которое я создал. Это работает. Он делает то, что я ожидаю. Однако я попытался использовать его в простом приложении Delphi, которое я также создал, и оно говорит, что не может его найти.

Спасибо,

Птичий

- Windows 10 Pro 64 бит
- Против 2017 года
- Дельфи Токио 10.2.3

Что я уже пробовал:

Мой код Delphi:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, cxGraphics, cxLookAndFeels, cxLookAndFeelPainters,
  Vcl.Menus, Vcl.StdCtrls, cxButtons;

  Function CreateExcelWorkbook: boolean; STDCALL; EXTERNAL 'KTExternalFunctions.dll';

type
  TForm1 = class(TForm)
    cxButton1: TcxButton;
    procedure cxButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.cxButton1Click(Sender: TObject);
begin
  CreateExcelWorkbook;
end;

end.

Код Delphi компилируется но когда я пытаюсь его запустить я получаю это сообщение об ошибке:

"Выполнение кода не может продолжаться из-за KTExternalFunctions.dll не была найдена. Переустановка программы может устранить эту проблему."

Все, что я читал об этом, говорит о том, что я правильно ссылаюсь на него в своем предложении uses.

Единственная разница, которую я вижу, заключается в том, что когда я вызываю DLL в своем vb.net приложение я должен квалифицировать его с помощью класса, в котором содержится функция, например (где KTFunctions-это имя класса):

Imports System.Drawing
Imports DevExpress.Spreadsheet
Imports KTExternalFunctions


Public Class XtraForm1
    Private Sub SimpleButton1_Click(sender As Object, e As EventArgs) Handles SimpleButton1.Click

        KTFunctions.CreateExcelWorkbook()


Я не могу найти никаких примеров этого для Delphi и не уверен, как это сделать, или даже если это вся проблема.

Gerry Schmitz

Вы пробовали поместить свою "новую" dll в ту же папку, из которой вы запускаете свой Delphi exe?

avianrand

Да. Я действительно пытался это сделать. Я также попытался добавить путь к папке выпуска dll в объявление функции в Delphi. Ни то, ни другое не сработало. Я уверен, что я что-то испортил с тем, как я создаю dll или как я ее регистрирую. Я тоже попробовал его в качестве кома, но это ничего не дало. Я зарегистрировал его с помощью RegAsm.exe но даже если он не зарегистрирован он все равно работает когда я вызываю его из своего теста vb.net приложение, так что я не уверен, что происходит. Я ни в коем случае не специалист по dll. Мне нужно сделать что-то в .net, что я могу запустить из Delphi, потому что это не может быть сделано в Delphi.

2 Ответов

Рейтинг:
2

avianrand

Не обращай на это внимания. Я сдался и нашел более простой и продуктивный способ. Я использую перекрестные помехи AtoZed для использования .net DLL в Delphi. И я использую EPPlus в .net для создания файлов Excel, которые мне нужны. Все это прекрасно работает.


Рейтинг:
1

avianrand

Ладно, я знаю, что это не решение, но нет хорошего места, чтобы положить это. Я не хочу помещать его в операционную как "улучшение", потому что это может не быть замечено. И если я публикую его в качестве комментария, он не позволяет мне создавать теги кода. Значит, он здесь.

Ранее я говорил, что собираюсь справиться с этим с помощью консольного приложения. Хотя это работает, на самом деле это не тот путь, которым я хочу идти. Я не могу вернуть ничего ценного из консольного приложения, и вызов его совсем не элегантен. Мне действительно нужно, чтобы это была библиотека dll.

Поэтому я придумал еще более простой вариант. Я этого не заметил. Я могу использовать его в другом vb.net формы приложения просто прекрасны, потому что легко создать ссылку на него.

Вот мой dll-код (здесь нет никаких специальных ссылок, только стандартные для .net-библиотеки dll):

Public Class Class1
    Public Shared Function returnJunk(inputParam As Int16)
        Select Case inputParam
            Case 1
                Return "one"
            Case 2
                Return "two"
            Case 3
                Return "three"
            Case 4
                Return "four"
            Case 5
                Return "five"
            Case Else
                Return "nothing"
        End Select
    End Function
End Class

Вот мой звонок к нему от vb.net
Private Sub SimpleButton2_Click(sender As Object, e As EventArgs) Handles SimpleButton2.Click
    MessageBox.Show(TestDLLJunk.Class1.returnJunk(14))
End Sub

В вызывающем приложении я просто щелкнул Правой Кнопкой Мыши ссылки и просмотрел, где находится скомпилированная dll. Он показывает полный путь к нему в свойствах ссылки на библиотеку dll.

И тогда я сделал то же самое, что и раньше в Дельфах. Это в моем интерфейсе используется:

Function returnJunk(inputParam: Byte): string; STDCALL; EXTERNAL 'TestJunk.dll';


Компиляция моего dll-кода создает 3 файла. Я поместил их все в исходную папку моего проекта Delphi, а также в папку Win32\debug только для усмешек.

А это мой код вызова:
procedure TForm1.Button2Click(Sender: TObject);
var
  rj: string;
begin
  rj := returnJunk(4);
end;


То же, что и раньше. Он компилируется, но не запускается. Я получаю то же самое сообщение, что и в моем О. П.

А потом, черт возьми, я его зарегистрировал:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe D:\Data\1Work\KT\DelphiTokyoVersion\TokyoConversionTestProjects\TestDLLJunk\bin\Release\TestDLLJunk.dll /tlb /кодовая база

Те же результаты, что и раньше.


avianrand

У меня был разговор по электронной почте с сотрудником технической поддержки в Embarcadero. Я совершенно уверен, что моя проблема не имеет никакого отношения к Дельфи. Я думаю, что это то, как я создаю DLL. Я создал новый вопрос, сосредоточившись исключительно на этом вопросе:

https://www.codeproject.com/Questions/1248969/My-registered-DLL-doesnt-show-up-in-assemblies-ext

Как только это будет решено, я перепечатаю здесь все, что в конечном итоге сработает.