2010-06-25 50 views
1

参数类型,我上一个项目,我需要导入一个DLL文件时创建一个几年前一个VB项目。该DLL是用C++创建的,是这样的:使用DLL导入/中声明VB.NET与不使用.NET

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 

是“作为布尔型”的返回类型吗?如果是这样,我尝试使用“Sub”,它说“关键字不会命名一个类型”。因此,我为什么研究声明,因为它似乎可以返回void/sub作为返回类型。

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

+0

PS - 我尝试添加此作为参考,我得到了说,这是不是一个有效的COM文件中的错误。 – ibarczewski 2010-06-25 13:56:54

+0

我们需要更多关于'SourceOrTarget :: Enum','CoordinateTuple'和'Accuracy'自定义类型的信息。 VB和C#只能处理简单的C函数,没有C++函数(编组的目的是提供简单的访问Windows API),因此,如果这些类型都是非POD类型,您必须编写与任何一个C或C++包装。 NET界面。至少,你必须摆脱C++引用参数并声明函数'extern“C”'。 – Philipp 2010-06-25 15:13:36

+0

你在说C++代码吗?因为我无法以任何方式,形状或形式修改它。 – ibarczewski 2010-06-25 15:33:39

回答

3

在VB中你说要么Public Function Whatever (params) As ReturnType(这是在C#一样public ReturnType Whatever(params))或Public Sub Whatever (params)这是东西,不返回任何东西(返回C++/C#void)。

如果你的函数/子需要自定义类型,您将需要.NET等效申报的为好。这可以使PInvoke努力工作。像the interop assistant这样的工具可以提供帮助。

+0

所以我基本上需要将类型从C++转换为VB.net? – ibarczewski 2010-06-25 14:46:50

+0

是的。如果你使用interop助手,你可以基本上粘贴C++ defs,它会让你把VB放在你的DllImport语句之前。 – 2010-06-25 14:49:44

+0

好的,很酷。我会稍微测试一下你的方法,然后给你答案,如果它有效的话:) – ibarczewski 2010-06-25 15:24:33

0

对于自定义类型,你可能必须创建在托管C++,它有能力既消耗本机C++ API和揭露托管API的包装。虽然过时,演练可以在这里找到:

+0

只有在类型复杂的情况下。 .NET编组可以很好地处理POD类型。 – Philipp 2010-06-25 15:10:24