0

.net で使用したい dll があります。dllimport を使用しようとしていますが、エラーが発生します。Windows system32 フォルダーに dll を配置し、exe が保存されている場所にも配置しました。vb で動作するように与えられた関数定義は次のとおりです。

        declare function LocalToWGS84 lib "TTDatum3.Dll"(Lat As Double, Lon As Double, ByVal Datum As Long) As Long

メソッド署名

    #ifdef __cplusplus
extern "C" {
#endif

int __stdcall WGS84ToLocal(double * lat, double * longt, int d);

c#

  class Program
{

    [DllImport("TTDatum3.Dll", EntryPoint="LocalToWGS84")]
    public static extern long LocalToWGS84([In,Out]double lat, [In,Out]double lon,[In,Out]long datum);

    public static void Main(string[] args)
    {
        Console.WriteLine(LocalToWGS84(50.82011492,-0.117981131, 150));

    }
}

エラーは次のとおりです。

未処理の例外: System.AccessViolationException: 保護されたメモリの読み取りまたは書き込みを試みました。これは多くの場合、他のメモリが破損していることを示しています

4

3 に答える 3

0

うーん、メソッドの署名を知らなくても、暗闇の中で突き刺すのは少しえぇ、デルファイをサポートするリフレクター/逆コンパイラツールを探してください。これらのいくつかを試して、メソッドの署名を取得できます。DeDe はビジネスのようです (投稿の古さはわかりません) Delphi Decompilers

MarshalAs 属性を試すこともできますが、試すことができることはたくさんあります。メソッドのシグネチャを知らなければ、非常に行き当たりばったりです。

于 2012-08-23T10:39:12.023 に答える
0

Long in VB6 != Long in c#.net

Long を int に変更

于 2012-08-23T10:33:06.073 に答える
0

C 定義では、lat および lon パラメータは int の ( int*) へのポインタとして定義されているため、パラメータを としてマークする必要がありますref。また、戻り値とデータム パラメータは、次のようにする必要がintあります。

 [DllImport("TTDatum3.Dll", EntryPoint="LocalToWGS84")]
 public static extern int LocalToWGS84([In,Out]ref double lat, [In,Out]ref double lon,[In,Out]int datum);
于 2012-08-23T14:49:48.500 に答える