Звоните C # dll из Delphi - PullRequest
12 голосов
/ 30 мая 2011

Я написал .Net 3.5 dll с одним методом, который должен вызываться Delphi .exe.К сожалению, это не работает.

Шаги: 1. Создайте C # 3.5 dll с кодом:

public class MyDllClass
{
    public static int MyDllMethod(int i)
    {
        MessageBox.Show("The number is " + i.ToString());
    }
}
  1. Перейдите в Свойства сборки -> Информация о сборке и отметьте "Make Assembly COM-Visible "
  2. Использовал RegAsm.exe для регистрации моей dll

Это вызывает исключение Delphi, которое указывает, что он не может подключиться к dll.Какие шаги необходимы для включения использования C # управляемого dll из неуправляемого кода.

Кто-нибудь знаком с хорошим примером по этому вопросу?

Спасибо

Ответы [ 4 ]

33 голосов
/ 30 мая 2011

Возможно, вам больше повезет, если вы пропустите COM-часть, используя мой шаблон проекта для неуправляемого экспорта

class MyDllClass
{
    [DllExport]
    static int MyDllMethod(int i)
    {
        MessageBox.Show("The number is " + i.ToString());
        return i + 2;
    }
}

В Delphi вы импортируете его так:

function MyDllMethod(i : Integer) : Integer; stdcall; extern 'YourAssembly.dll';

Я должен был отклонить ваш вопрос, хотя. Ибо даже не столько заботы, сколько предоставления кода, который будет компилироваться. (ваш метод C # не возвращает значение, но ожидается как int)

8 голосов
/ 22 июня 2011

После масштабного расследования я нашел решение: все дело в параметрах регистрации. Флаг / кодовая база должны быть добавлены к команде regasm.

Во многих публикациях предлагается использовать Guid и другие COM-атрибуты для открытого объекта C # Com. Мне удалось доставить COM-функциональность с помощью атрибута ComVisible (true) и команды regasm / tlb / codebse.

Код:

[Guid("7DEE7A79-C1C6-41E0-9989-582D97E0D9F2")]
[ComVisible(true)]
public class ServicesTester
{
    public ServicesTester()
    {
    }

    //[ComVisible(true)]
    public void TestMethod()
    {
        MessageBox.Show("You are in TestMEthod Function");
    }
}

и, как я уже говорил, я использовал regasm.exe / tlb / codebase, чтобы зарегистрировать его

2 голосов
/ 30 мая 2011

Одна вещь, которая может быть проблемой, если вы сделали свою сборку x64 или AnyCPU.Поскольку Delphi является 32-битной (x86), вам нужно сделать сборку x86 или убедиться, что regasm.exe также регистрирует ее в 32-битном реестре.Это можно сделать с помощью версии regasm.exe для x86.

0 голосов
/ 30 мая 2011

Вы должны узнать больше об инструментах, которые вы используете.Вы пытаетесь соединить два совершенно разных мира (.Net, Delphi), используя еще одну (не слишком простую) технологию: COM.Ваш вопрос ясно показывает, что у вас нет достаточного понимания COM и, вероятно, нет .Net.Нет простого примера, который решает именно ваш вариант использования.Вы должны изучить COM, чем научиться делать код .Net доступным для COM, а затем научиться вызывать COM-объекты из Delphi.Это уже ярлык.Больше нет доступных ярлыков!

...