在非托管C-DLL中使用C#中的函数(AccessViolationException)

时间:2015-02-14 10:50:24

标签: c# dll dllimport access-violation

我有一个带有简短文档的C-DLL,我想在我的C#程序中使用这个DLL。

不幸的是,该文档适用于受密码保护的Excel-Makro,因此我不知道确切的函数名称和参数类型。

我使用DependencyWalker查找DLL的所有导出函数,并与文档一起我发现记录的函数 ptx 被称为 FU_PTX DLL中的 并期望一个参数并具有返回值。不幸的是,我仍然不知道参数的类型或返回值,但我知道它是一个数字。

所以我写了以下代码:

...
        [DllImport("dmata.dll")]
        public static extern UInt32 FU_PTX(UInt32 x);

        FU_PTX(11); 
...

此代码抛出 AccessViolationException 。我还尝试了其他类型 int long double < / strong>但我总是得到同样的例外。

据我所知,没有办法直接从dll获取所需的类型,但也许任何人都知道可能出错的地方或者可以指向正确的方向。


修改

我设法从vba文件中获取签名:

Private Declare Function FU_PTX# Lib "dmata.dll" (FT#)

我把它移植到以下C#代码:

[DllImport("dmata.dll")]
public static extern double FU_PTX(double x);


FU_PTX(1.5);

我仍然收到相同的 AccessViolationException 。   任何人都知道为什么我仍然得到同样的例外?

1 个答案:

答案 0 :(得分:2)

此语法:

Private Declare Function FU_PTX# Lib "dmata.dll" (FT#)

使用#后缀相当模糊;在“现代”VBA(如果可以说是这样的事情)声明将是

Private Declare Function FU_PTX Lib "dmata.dll" (ByRef FT As Double) As Double

请注意ByRef的不幸违约;默认情况下,参数在VBA中通过引用传递(即使函数无意修改它们)。

这应该与以下C#声明相对应:

[DllImport("dmata.dll")]
public static extern double FU_PTX(ref double FT);

由于参数是通过引用传递的,因此不能传递常量并且必须始终使用变量:

double ft = 11.0;
FU_PTX(ref ft);