est ici le natif (Delphi 7) Fonction:Comment appeler cette fonction dll native à partir de C#?
function Foo(const PAnsiChar input) : PAnsiChar; stdcall; export;
var
s : string;
begin
s := SomeInternalMethod(input);
Result := PAnsiChar(s);
end;
Je dois appeler cela de C#, mais le nom de la dll n'est pas connu au moment de la compilation - donc je dois utiliser LoadLibrary pour y accéder.
C'est ce que mon code C# ressemble à ce jour:
[DllImport("kernel32.dll")]
public extern static IntPtr LoadLibrary(String lpFileName);
[DllImport("kernel32.dll")]
public extern static IntPtr GetProcAddress(IntPtr handle, string funcName);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate string FooFunction(string input);
...
IntPtr dllHandle = LoadLibrary(dllName);
IntPtr fooProcAddr = GetProcAddress(dllHandle, "Foo");
FooFunction foo = (FooFunction)Marshal.GetDelegateForFunctionPointer(
fooProcAddr, typeof(FooFuncion)
);
string output = foo(myInputString);
Maintenant, cela fonctionne en fait - au moins, le code delphi reçoit correctement la chaîne, et le code C# reçoit la chaîne de sortie.
Cependant, je l'ai remarqué quelques étrangetés lors du débogage du code delphi quand il est appelé à partir du code C# - le débogueur saute les lignes quand il ne devrait pas ..
Et je crains que je fuite mémoire - est-ce que quelqu'un nettoie ces PChars?
Quelqu'un peut-il me donner quelques commentaires/conseils sur la façon dont cela devrait être fait?
La seule fois où j'ai vu un débogueur ignorer des lignes alors qu'il ne le devrait pas, c'est quand le code compilé ne correspond pas à la source. Êtes-vous certain que vous êtes lié à la bonne version de l'assemblage? –