【问题标题】:c++ dll using dllimport c#c++ dll 使用 dllimport c#
【发布时间】:2012-08-23 10:10:23
【问题描述】:

我有一个我想在 .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:试图读取或写入受保护的内存。这通常表明其他内存已损坏

【问题讨论】:

  • 你也可以把方法的签名吗?我的意思是 C++ 中的方法签名?
  • 我没有原代码的方法签名,听说是delphi写的。
  • 从参数中移除 [In,Out]...
  • 嗯.. 尝试从参数中删除 [In, Out] 部分。如果这些参数用作输出参数,请尝试将它们设为out 参数。如果它们同时用于输入和输出,请尝试将它们设为ref 参数。
  • 该函数不返回 long 或将 long 作为最后一个参数。除非 VB 使用 32 位 longs(.Net 肯定不会),否则很可能会破坏堆栈。

标签: c# c++ dll dllimport


【解决方案1】:

由于 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);

【讨论】:

    【解决方案2】:

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

    将 Long 更改为 int

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-19
        • 2021-07-11
        • 2020-02-19
        • 2016-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-09
        相关资源
        最近更新 更多