Я пытаюсь вызвать функцию Delphi из кода ASP.NET C#. Объявление функции похоже на это:
function SomeFunction(const someString, SomeOtherString: string): OleVariant;
Из моего кода C# у меня есть этот код:
[DLLImport(MyDLL.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern object SomeFunction(string someString, string SomeOtherString);
Каждый раз, когда я называю этот Метод и храню его как объект, я получаю ошибку P/Invoke. Я никогда не называл неуправляемый код от своего C# прежде, таким образом, я отчасти в недоумении.
Вы не можете вызвать эту функцию DLL, потому что она использует специфичный для Delphi тип данных строка
, который не имеет эквивалент в продуктах, не принадлежащих Embarcadero. (Даже если ваш код C # может соответствовать структуре строкового типа Delphi, вам также потребуется выделить память с помощью диспетчера памяти DLL, который он почти наверняка не экспортирует.)
Если вы иметь возможность изменить DLL, а затем сделать параметры типа PAnsiChar или PWideChar. (Судя по вашему объявлению C #, вам нужен PAnsiChar.) Это то, что DLL должна была использовать все время.
Если вы не можете изменить DLL, напишите DLL-оболочку в Delphi или C ++ Builder, которая использует PAnsiChar или PWideChar, а затем перенаправит эти параметры в исходную DLL Delphi. Или громко пожаловаться поставщику DLL и запросить новую версию, в которой используются типы, более удобные для других языков.
Попробуйте
[DLLImport(MyDLL.dll, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern IntPtr SomeFunction(string someString, string SomeOtherString);
и используйте Marshal.GetObjectForNativeVariant
с возвращаемым значением, чтобы получить .NET объект.