从非托管 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);
我有一个带有简短文档的 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);