Звоните 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());
}
}
- Перейдите в Свойства сборки -> Информация о сборке и отметьте "Сделать сборку видимой"
- Использовал 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. Это уже ярлык. Дальнейшие ярлыки недоступны!