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

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

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

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

9 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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