C dll からアンマネージ関数を呼び出すために PInvoke を使用しようとしています。dll のソースを開発者に公開できないため、一部の開発者は次の宣言を使用して Delphi で関数を呼び出しました。CDECL 呼び出し規約で SAT.dll を使用します。
function AssociarAssinatura( numeroSessao : Longint; codigoDeAtivacao: PChar;
CNPJvalue : PChar; assinaturaCNPJs : PChar ) : PChar ;
cdecl; External 'SAT.DLL';
その構造に基づいて、同じ DLL から同じ機能をテストするために、C# で次のコンソール アプリケーションを作成しました。私はいくつかの調査を行い、Delphi の Longint に相当するものは C# では int であり、PChar に相当するものは文字列へのポインタであることがわかりました (ただし、C# の文字列を使用しました)。
class Program
{
[DllImport("SAT.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern string AssociarAssinatura(int numeroSessao,
string codigoDeAtivacao, string CNPJvalue, string assinaturaCNPJs);
static void Main(string[] args)
{
Console.WriteLine("Comienza");
int numeroSessao = 111111;
string codigoDeAtivacao = "123123123";
string cnpJvalue = "2222222222222211111111111111";
string assinaturaCnpJs = "lrafwegmqcgvpzpbdmcmcgdvf";
string resposta = AssociarAssinatura(numeroSessao, codigoDeAtivacao,
cnpJvalue, assinaturaCnpJs);
Console.WriteLine(resposta);
}
}
関数を呼び出すと、AccesViolationException がスローされます。AssociarAssinatura のコードには、関数のコードが実際に正常に実行されていることを示す内部プリントがいくつかあります。このため、関数が値を返すときに問題が関連していると思います。私の最善の推測は、どういうわけか呼び出し規約に問題があるということです。何かご意見は?