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

Use functions in C# from unmanaged C-DLL (AccessViolationException)

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

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

我使用 DependencyWalker 找到了 DLL 的所有导出函数,结合文档我发现记录的函数 ptx 是在 DLL 中调用 FU_PTX 并需要一个参数并具有 return 值。不幸的是,我仍然不知道参数的类型或 return 值,但我知道它是一个数字。

所以我写了下面的代码:

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

        FU_PTX(11); 
...

此代码抛出 AccessViolationException。我还尝试了其他类型 int, long, double 但我总是遇到同样的异常。

据我所知,没有办法直接从 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。 有人知道为什么我仍然得到同样的异常吗?

此语法:

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

因使用 # 后缀而相当晦涩;在 "modern" 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);