2010-08-19 175 views
3

我在Google中找到了很多關於如何從.NET代碼調用非託管DLL中的API函數的示例,但是如何從非託管代碼實例化對象呢?從.NET實例化非託管類

我目前正在修補一箇舊的遺留應用程序在工作中(並且我還不確定我們是否能夠做任何事情,但是修補程序和研究我必須)該公司希望遷移到.NET。看起來這是之前嘗試過的,現在我正在仔細研究。最常見的編譯錯誤是對項目不理解的舊DLL的引用。

在這一行代碼的一個例子是:

Dim cAccounts As HSVMETADATALib.HsvAccounts 

有一個損壞的引用在項目庫中,我相信這是一些嚮導驅動的嘗試的結果,只是口一定預.NET項目到.NET。我有它尋找DLL,但添加到它的引用返回錯誤:

A reference to 'HFMConstants.dll' could nto be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component.

現在,我知道什麼這個DLL。而且我有很多很有 pre.NET Windows編程的經驗。因此,我一直在網上尋找有關在此代碼中使用舊DLL的信息,並且都側重於調用DLL中的API函數。但是,仔細查看這些代碼,關於API函數和更多關於對象的內容就更少了。那麼我將如何去實例化這些對象之一的實例呢?

(請注意,這是其中一種情況,我們甚至不知道我們是否有正確的源代碼,沒有文檔,沒有任何關於此應用程序的所有權和維護的內容,能夠實例化來自外部DLL的對象的障礙是來自某些未知且可能無法訪問的第三方來源,它將減少大部分編譯器錯誤並幫助我們進入更多的代碼,即使獲得至少一個編譯精簡版。)

這是模糊的,但它是值得一問:)

回答

3

我建議你試試用Dependency Walker打開DLL。這應該給你更多關於DLL的內部和API的信息。

另請參見:

引用不CLR DLL
http://illuminatedcomputing.com/blog/?p=44

+0

我喜歡這個Dependency Walker,漂亮的小工具。當然,這一個樣本DLL有一個大型的依賴關係樹(其中一些沒有找到,我想這將是另一個有趣的路障)。我不確定這裏面的信息對於這項工作特別有用,但我現在可以放心地忽略。 – David 2010-08-19 17:02:45

1

你需要嘗試找出更多informati關於這個DLL。例如,如果它是一個COM對象,你可以生成一個強類型的託管包裝,它將允許你使用tlbimp.exe。如果它是一個標準的Win32庫,你需要找出它是否暴露了一些函數,它們的名字和參數是爲了PInvoke它們。您可以使用dumpbin.exe來查看導出的函數名稱的列表。

+0

我猜這不是COM。 ActiveX可能嗎?如果有的話,我不太瞭解它們之間的差異。 tlbimp創建了一個DLL,但它似乎不可用。 PInvoke僅用於調用方法,不是嗎?我沒有發現任何關於用它來實例化對象的東西。 – David 2010-08-19 17:00:17

+0

如果它是一個COM對象,'tlbimp'應該生成一個包含暴露類型的託管程序集。 – 2010-08-19 17:04:14

0

你可以註釋掉所有不編譯代碼,任何依賴於你沒有文件。

如果您有.dll及其所有依賴的.dll文件,您應該可以將它添加到您的項目引用。如果沒有,沒有外部文檔,很難弄清楚編譯代碼在做什麼。