Звоните C# dll из Delphi

Я написал.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. Перейдите в Свойства сборки -> Информация о сборке и отметьте "Сделать сборку видимой"
  2. Использовал RegAsm.exe для регистрации моей dll

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

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

Спасибо

4 ответа

Решение

После масштабного расследования я нашел решение: все дело в параметрах регистрации. Флаг / кодовая база должны быть добавлены к команде 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, чтобы зарегистрировать его

Возможно, вам больше повезет, пропустив часть 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)

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

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

Другие вопросы по тегам