0

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 のコードには、関数のコードが実際に正常に実行されていることを示す内部プリントがいくつかあります。このため、関数が値を返すときに問題が関連していると思います。私の最善の推測は、どういうわけか呼び出し規約に問題があるということです。何かご意見は?

4

1 に答える 1

0

ここでの問題はPChar、Delphi の型に関連している可能性が最も高いです。C# では、文字列は既定で Unicode であり、func を呼び出すと、実際には a から への変換が行われますPCharPWideCharこれは、この new を保持するために新しいメモリ ブロックが割り当てられることを意味しますPWideChar。この相互運用性と、.NET と Delphi での文字列の処理方法の違いにより、AccessViolationException.

属性を使用してMarshalAs、特定の型の処理方法を .NET に明示的に伝えることができます。

[DllImport("SAT.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern string AssociarAssinatura(int numeroSessao, 
    [MarshalAs(UnmanagedType.LPStr)] string codigoDeAtivacao, [MarshalAs(UnmanagedType.LPStr)] string CNPJvalue, [MarshalAs(UnmanagedType.LPStr)] string assinaturaCNPJs);

文字列の処理方法を明示的に指定します。その後、コードは問題ないはずです。

于 2013-07-03T23:23:37.033 に答える