UDF en C# - fonction renvoyant du string - ib_util_malloc()
Bonjour à tous.
Je vous donne le contexte :
Je suis développeur .net, mes applications sont développés en C#.
J'ai une application v1 installée chez des clients qui utilise une base firebird, tandis que la V2 de l'application distribuée maintenant, utilise une base Sql serveur.
Je continu à maintenir la v1, les clients sont satisfaits et ne souhaitent pas passer à la v2.
Ce que je souhaite faire :
Je dois générer une valeur de type string en fonction de données et l'enregistrer dans un champs d'une table.
Que se soit pour la base firebird ou sql serveur, c'est exactement le même traitement, j'ai donc pensé créer une dll avec ma fonction qui me renvoie ma valeur.
Cette dll sera utilisée à la fois par sql serveur mais aussi par firebird sous forme d'UDF externe.
Pour l'utilisation sous SQL serveur je n'ai pas de problème, ça fonctionne.
C'est plus compliqué avec Firebird.
J'arrive à utiliser ma fonction si elle me retourne autre chose qu'une chaine de caractères (int, decimal...).
D'après la FAQ Firebird, je vois qu'il y a une gestion particulière de la mémoire allouée à faire lorsqu'un UDF renvoi du string.
http://firebirdfaq.org/faq83/
il faut utiliser ib_util_malloc() de la dll ib_util.dll, dans cette même FAQ il y a un exemple d'utilisation en delphi.
Je ne connais pas le delphi, je comprend en gros ce qui se passe dans cette exemple mais je n'arrive pas à traduire ce code en C#.
Quelqu'un saurait-il comment retranscrire ce code en C# ?
Code:
1 2 3 4 5 6 7 8 9 10
| function ib_util_malloc(l: integer): pointer; cdecl; external 'ib_util.dll';
function ChangeMyString(const p: PAnsiChar): PAnsiChar; cdecl;
var
s: string;
begin
s := DoSomething(string(p));
Result := ib_util_malloc(Length(s) + 1);
StrPCopy(Result, AnsiString(s));
end; |
Merci pour votre aide !
Forent...