【发布时间】: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 肯定不会),否则很可能会破坏堆栈。