EDITAR: He publicado una mejor implementación de esto, a continuación. Dejé esto aquí para que las respuestas tuvieran sentido.Llamar a una DLL de Delphi desde una aplicación de C# .NET
He realizado numerosas búsquedas del método correcto para escribir una DLL en Delphi y poder llamarla desde C#, pasando y devolviendo cadenas. Mucha de la información era incompleta o incorrecta. Después de mucho ensayo y error, encontré la solución.
Esto fue compilado usando Delphi 2007 y VS 2010. Sospecho que funcionará bien en otras versiones también.
Aquí está el código Delphi. Recuerde incluir información de versión en el proyecto.
library DelphiLibrary;
uses SysUtils;
// Compiled using Delphi 2007.
// NOTE: If your project doesn't have version information included, you may
// receive the error "The "ResolveManifestFiles" task failed unexpectedly"
// when compiling the C# application.
{$R *.res}
// Example function takes an input integer and input string, and returns
// inputInt + 1, and inputString + ' ' + IntToStr(outputInt) as output
// parameters. If successful, the return result is nil (null), otherwise it is
// the exception message string.
// NOTE: I've posted a better version of this below. You should use that instead.
function DelphiFunction(inputInt : integer; inputString : PAnsiChar;
out outputInt : integer; out outputString : PAnsiChar)
: PAnsiChar; stdcall; export;
var s : string;
begin
outputInt := 0;
outputString := nil;
try
outputInt := inputInt + 1;
s := inputString + ' ' + IntToStr(outputInt);
outputString := PAnsiChar(s);
Result := nil;
except
on e : exception do Result := PAnsiChar(e.Message);
end;
end;
// I would have thought having "export" at the end of the function declartion
// (above) would have been enough to export the function, but I couldn't get it
// to work without this line also.
exports DelphiFunction;
begin
end.
Aquí está el código C#:
using System;
using System.Runtime.InteropServices;
namespace CsharpApp
{
class Program
{
// I added DelphiLibrary.dll to my project (NOT in References, but
// "Add existing file"). In Properties for the dll, I set "BuildAction"
// to None, and "Copy to Output Directory" to "Copy always".
// Make sure your Delphi dll has version information included.
[DllImport("DelphiLibrary.dll",
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Ansi)]
public static extern
string DelphiFunction(int inputInt, string inputString,
out int outputInt, out string outputString);
static void Main(string[] args)
{
int inputInt = 1;
string inputString = "This is a test";
int outputInt;
string outputString;
// NOTE: I've posted a better version of this below. You should use that instead.
Console.WriteLine("inputInt = {0}, intputString = \"{1}\"",
inputInt, inputString);
var errorString = DelphiFunction(inputInt, inputString,
out outputInt, out outputString);
if (errorString != null)
Console.WriteLine("Error = \"{0}\"", errorString);
else
Console.WriteLine("outputInt = {0}, outputString = \"{1}\"",
outputInt, outputString);
Console.Write("Press Enter:");
Console.ReadLine();
}
}
}
Espero que esta información ayuda a otra persona para no tener que tirar de los pelos tanto como lo hice.
No es realmente una pregunta, pero 1 :). –
No estoy familiarizado con Delphi, pero sé si es posible convertirlo en 'COM' es fácil de usar en C#, hice una pequeña búsqueda y encontré algún recurso que trata acerca de delphi y la relación COM aquí: http: // delphi.about.com/library/weekly/aa122804a.htm –
Debe volver a formular su pregunta para decir "¿Cuál es la forma correcta de utilizar un DLL de Delphi desde una aplicación C# .NET?" y luego respondete a ti mismo con el resto de tu publicación. Consulte http://stackoverflow.com/faq (Puede contestar su propia pregunta) y aquí: http://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions –