簡體   English   中英

在Visual Studio 2005和Visual C ++ 6.0中進行編譯

[英]compiling in visual studio 2005 and visual C++ 6.0

  1. 在Visual Studio 2005和Visual C ++之間創建簡單的C DLL有什么區別。 我看到在Studio下創建它時也創建了一個清單,並且由於使用並排文件夾(當從C#應用程序調用該dll時,我在另一台計算機上進行部署時遇到了一些問題”
  2. 調用dll的機制如何工作?

謝謝

是的,如果使用/ MD(默認設置)編譯DLL的代碼,則必須將CRT庫部署到目標計算機。 如果這只是一個沒有任何其他依賴項的獨立DLL,則可以使用靜態CRT選項進行編譯,因此您不必部署這些庫。 右鍵單擊您的DLL項目,“屬性”,“ C / C ++”,“代碼生成”,“運行時庫” = / MTd以進行“調試”配置。 重復執行Release配置,現在使用/ MT。

Google的“ P / Invoke封送處理”以了解有關如何從托管程序中調用非托管代碼的更多信息。

由於nobugz已經涵蓋了您的第一個問題,因此讓我繼續講第二個問題。 這並不難理解。

在Windows中編譯DLL時,鏈接器將創建一個導出地址表(EAT),該地址列出所有導出的功能(DLL提供的功能)以及指向在DLL自身中實現位置的指針。

編譯鏈接到DLL的應用程序時,鏈接器將創建一個導入地址表(IAT),其中列出了在其他DLL中實現的所有功能以及實現這些功能的DLL的名稱。 知道函數存在於DLL中的方式來自添加到項目中的.lib文件。 這告訴鏈接器函數是在DLL中實現的。

然后在運行時,在加載應用程序時,Windows加載器將檢查IAT以查看需要加載哪些DLL,找到它們,然后更新應用程序IAT(在內存中)以指向已加載DLL中的導出函數。

這就是它工作的基礎,希望我沒有包括任何嚴重的錯誤。 當然,P / Invoke是這之上的另一層。

如果您想了解有關DLL的工作原理的更多信息,請始終查閱MSDN文檔,並且如果您想獲得足夠的詳細信息以方便使用,請閱讀以下Windows Inside文章第1 部分第2部分

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM