我有一个带有简短文档的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 。 任何人都知道为什么我仍然得到同样的例外?
答案 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);