0

我有一个我想在 .net 中使用的 dll。我正在尝试使用 dllimport,但出现错误。我已将 dll 放在 windows system32 文件夹以及 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

VB6 中的长!= c#.net 中的长

将 Long 更改为 int

于 2012-08-23T10:33:06.073 回答
0

嗯,在不知道方法签名的情况下,你在黑暗中刺了一下 eh,寻找支持 delphi 的反射器/反编译器工具,你可以尝试其中一些来获取方法签名;DeDe 似乎是生意(不确定帖子的年龄)Delphi Decompilers

您可以尝试 MarshalAs 属性,但您可以再次尝试很多。在不知道方法签名的情况下,它非常受欢迎。

于 2012-08-23T10:39:12.023 回答
0

由于 lat 和 lon 参数在 C 定义中被定义为指向 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 回答