Возврат строк из dll Delphi в C#C#

Место общения программистов C#
Ответить
Гость
 Возврат строк из dll Delphi в C#

Сообщение Гость »


У меня есть dll-библиотека Delphi, и я хочу возвращать строки в API C#.

Я использую Delphi 11 и .NET 7

Я уже задавал аналогичный вопрос раньше, и мне пришлось работать с отправкой буфера в Delphi, который заполнялся и возвращался как параметр out.

Теперь мне нужна функция, возвращающая строку неизвестной длины, и я изо всех сил пытаюсь заставить ее работать.

Вот небольшой пример, показывающий ошибки:

Делфи:

библиотека Project1; использует Шаремем; {$R *.res} функция TestWide(aInput: WideString): WideString; начинать результат: = Вход; конец; функция TestPChar(aInput: PChar): PChar; начинать результат: = Вход; конец; функция TestString(aInput: string): строка; начинать результат: = Вход; конец; экспорт TestWide, TestPChar, TestString; начинать конец. C#: (Конкретные атрибуты DllImport могут выглядеть случайными, поскольку я перепробовал все комбинации)

с использованием System.Runtime.InteropServices; Программа внутреннего класса { [DllImport("Project1.dll", EntryPoint = "TestWide", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, BestFitMapping = true)] [возврат: MarshalAs(UnmanagedType.BStr)] общедоступная статическая внешняя строка TestWide([MarshalAs(UnmanagedType.BStr)] строковый ввод); [DllImport("Project1.dll", EntryPoint = "TestPChar", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] [возврат: MarshalAs(UnmanagedType.LPStr)] общедоступная статическая внешняя строка TestPChar([MarshalAs(UnmanagedType.LPStr)] строковый ввод); [DllImport("Project1.dll", EntryPoint = "TestString", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] [возврат: MarshalAs(UnmanagedType.BStr)] общедоступная статическая внешняя строка TestString([MarshalAs(UnmanagedType.BStr)] строковый ввод); Private static void Main(string[] args) { пока (правда) { Console.WriteLine("Нажмите клавишу, чтобы проверить..."); Console.WriteLine("W для WideString"); Console.WriteLine("P для PChar"); Console.WriteLine("S для строки"); ключ вар = Console.ReadKey().KeyChar; пытаться { переключатель (ключ) { случай 'w': Console.WriteLine(TestWide("Широкий")); //Ошибка выполнения 203 по адресу перерыв; случай «р»: Console.WriteLine(TestPChar("Pchar")); //Другой код выхода с большим числом перерыв; случаи': TestString("ул"); //System.AccessViolation перерыв; по умолчанию: перерыв; } } поймать (Исключение e) { Console.WriteLine(e.Message); } } } } Кто-нибудь может указать мне правильное направление.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»