VB.Net:DllImport 和 Declare 语句的差异

标签 vb.net interop fortran

我正在尝试使用 Fortran 库中的函数。该函数应该返回一个字符串。如果我用这个

Friend Declare Ansi Sub LaA_LabelGet Lib "V3Mat.dll" (ByRef hLaA As IntPtr, ByVal iRegion As Integer, ByVal cLabel As String, ByVal intLabelLen As Integer)

声明如果我使用它工作正常

<DllImport("V3Mat.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Ansi)>
Friend Sub LaA_LabelGet(ByRef hLaA As IntPtr, ByVal iRegion As Integer, ByVal cLabel As String, ByVal intLabelLen As Integer)
End Sub

cLabel 始终为空。

谁能指出两者之间的区别。我宁愿使用第二个定义,因为它允许我通过使用常量来设置要使用的库。

最佳答案

Declare 语句是 VB.NET 中采用的遗留语法,其工作方式与 VB6 时代的工作方式相同。在您的情况下,它所做的一件事很重要,那就是它允许 native 代码写入到字符串中。就像在 VB6 中就可以实现一样。这在 .NET 中是完全无效的,字符串是不可变的。

<DllImport> 中的完全相同声明将是 <MarshalAs(UnmanagedType.VBByRefStr)> ByRef cLabel As String

更好的解决方案是将参数声明为 ByVal cLabel As StringBuilder并传递一个具有足够容量的正确初始化的 StringBuilder 对象。然后使用其ToString()方法获取返回的字符串。

关于VB.Net:DllImport 和 Declare 语句的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21678320/

相关文章:

c# - 如何使用 SafeHandle 或解决方法获取方法的 GetFunctionPointerForDelegate

c++ - 是否可以将指针的 C++ vector 传递给 Fortran?

Vb.net 组合框自动完成

.net - VB.NET 扩展方法

vb.net - VB.Net-无法在Access中创建字段 “password”

Vb.Net设置用户控件属性

java - 从 Java 向 Clojure 传递参数

performance - x86 和 x64 中的非托管到托管互操作性能

fortran - 函数引用正在调用子例程

file-io - 如何在 Fortran 中更快地读取具有某些条件的数据文件?