在VB.NET中使用DLL导入/声明,使用.NET未使用的参数类型

时间:2010-06-25 13:54:21

标签: c++ vb.net dll pinvoke dllimport

我正在开发一个项目,我必须将DLL文件导入几年前创建的VB项目中。 DLL是用C ++创建的,看起来像:

void CoordinateConversionService::convert( SourceOrTarget::Enum sourceDirection, SourceOrTarget::Enum targetDirection, CoordinateTuple* sourceCoordinates, Accuracy* sourceAccuracy, CoordinateTuple& targetCoordinates, Accuracy& targetAccuracy )

我是我工作的实习生,我还没有使用它,所以我的理解非常有限,以及我对VB的使用(我是一个C ++ / C#家伙)。以下是几个问题:

1)看看Dllimport,看起来参数之外的最后一部分是返回类型。来自其他网站的示例代码:

<DllImport("advapi32.dll")> _
  Public Function GetUserName( _
     ByVal lpBuffer As StringBuilder, _
     ByRef nSize As Integer) As Boolean

“As Boolean”是返回类型吗?如果是这样,我尝试使用“Sub”,它说“关键字没有命名类型”。因此,为什么我查看声明,因为我似乎可以返回void / sub作为返回类型。

2)尝试使用“CoordinateTuple”和“Accuracy”类型给我带来问题,说它们没有定义。我怎么解决这个问题,因为我认为我不能真正定义它们,以及它们是指针的事实呢?另外 - 我无法以任何方式修改C ++代码,所以我所拥有的就是我所拥有的。

2 个答案:

答案 0 :(得分:3)

在VB中,您可以说Public Function Whatever (params) As ReturnType(与C#中的public ReturnType Whatever(params)相同)或Public Sub Whatever (params)表示不返回任何内容的内容(返回void在C ++ / C#)。

如果你的function / sub采用自定义类型,你还需要声明.NET等价物。这可以使PInvoke努力工作。像the interop assistant这样的工具可以提供帮助。

答案 1 :(得分:0)

对于自定义类型,您可能必须在托管C ++中创建一个包装器,它既可以使用本机C ++ API,也可以公开托管API。虽然过时了,但可以在这里找到演练: