Создать C # DLL, которую можно импортировать в приложение Delphi, используя stdcall - возможно? - PullRequest
10 голосов
/ 30 июня 2009

У меня есть программа, для которой мне нужно создать DLL, надеюсь, на C #. Программа написана на Delphi, и у меня есть файл интерфейса для кода. Интерфейс использует соглашение о вызовах stdcall.

Можно ли создать C # DLL, которая соответствует интерфейсу и может использоваться в приложении Delphi?

Есть ли пример кода, который демонстрирует, как кодировать C # DLL в метод интерфейса stdcall?

Ответы [ 9 ]

7 голосов
/ 30 июня 2009

Это невозможно в чистом C #, но это статья , в которой показано, как добавить неуправляемую таблицу экспорта в вашу библиотеку C #, которую затем можно использовать на любом другом языке. Обратите внимание, что полчища ссылок на Blitz не должны вас отталкивать - они связаны с собственным контекстом автора и не имеют ничего общего с основной концепцией и тем, как она работает.

В есть также один раздел одной конференции Брайана Лонга . По иронии судьбы Delphi.Net фактически поддерживал неуправляемый экспорт, хотя C # этого не делал. Я понятия не имею, верно ли это и для Delphi Prism.

6 голосов
/ 30 июня 2009

Я был на этом пути раньше. Решение, которое я выбрал, состояло в том, чтобы создать NEW C # сборку (я позже перенес это на Prism), которая через com-взаимодействие открыла для меня функциональность, необходимую для достижения. С помощью «черного ящика» я обнаружил, что вызовы API стали проще: я смог сократить количество классов, с которыми мне приходилось сталкиваться через барьер взаимодействия.

Я посмотрел на Hydra, но то, что я пытался сделать, было излишним ... это был доступ к стороннему SDK, который был представлен в сборках .net для обработки данных. Если вы хотите встроить функциональность (объекты GUI, ECT) в ваше приложение, вам следует подумать о Hydra.

Я использовал Managed.VCL для очень ранней версии системы, но позже отказался от нее из-за подхода взаимодействия Prism / C # com, который был проще в развертывании и более стабилен.

3 голосов
/ 30 июня 2009

Из любопытства, почему вы надеетесь написать .dll, предназначенную для использования из собственного приложения на C #?

Управляемый C ++, Delphi для .Net, а теперь и Delphi Prism поддерживают это "из коробки", используя неуправляемый экспорт. По замыслу C # и VB.net нет. Не уверен почему. Но, как упоминал Кобус, вы можете взломать это. Делайте это на свой страх и риск.

В дополнение к Hydra от RemObjects, AToZed представляет CrossTalk .

3 голосов
/ 30 июня 2009

Посмотрите на Гидра

2 голосов
/ 30 июня 2009

Я предполагаю, что приложение Delphi не является приложением на основе .NET, и поэтому вам необходимо разместить среду выполнения .NET в процессе Win32.

CorBindToRuntimeEx - это функция внутри MSCorEE.dll, которая содержит среду выполнения .NET. С его помощью вы можете разместить среду выполнения, а затем создавать внутри нее объекты и взаимодействовать с ними.

2 голосов
/ 30 июня 2009

Я нашел сообщение от Роберта Гизеке в группах новостей Delphi Prism. В нем он анонсирует проект, который вы можете добавить в решение, которое позволяет экспортировать произвольные функции из .Net DLL, просто добавив к ним атрибут DllExport. Он поддерживает маршалинг так же, как DllImport. Он демонстрирует это с проектом Prism, но я думаю, что он будет работать и на классах C #. Сообщение было сделано в марте, поэтому я не уверен, будет ли приложение по-прежнему доступно. Майский выпуск Prism исключает такой инструмент, поскольку он сам поддерживает неуправляемый экспорт.

2 голосов
/ 30 июня 2009

Необходимо сделать сборку (= C # DLL) доступной для COM, который называется Interop.

См. Статьи MSDN Преобразование сборки в библиотеку типов и Упаковка сборки для COM , в которой описываются техническая база и утилиты для выполнения необходимых операций.

1 голос
/ 30 июня 2009

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

Тем не менее, можно разместить Common Language Runtime внутри приложения Delphi (или любого другого приложения Windows). Я понятия не имею, как это сделать. Я просто знаю, что это возможно. (Вполне вероятно, что именно эта «Гидра» и будет делать упомянутый Стивом.)

1 голос
/ 30 июня 2009

Я совершенно уверен, что это нельзя сделать напрямую. Вам придется либо написать слой в C ++ / CLI, либо представить код C # как интерфейс ActiveX. Но этот второй вариант может не соответствовать вашему интерфейсу.

...