2010-06-25 49 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