Возврат строк из dll Delphi в 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); } } } } Кто-нибудь может указать мне правильное направление.
У меня есть 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); } } } } Кто-нибудь может указать мне правильное направление.
Мобильная версия