Вызов c# dll из Delphi

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

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

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

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

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

спасибо

4 ответов


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

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)


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

многие сообщения там предлагают использовать Guid и другие com-атрибуты на объекте c# Com exposed, мне удалось доставить функциональность 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 / кодовая база для регистрации это


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


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