簡體   English   中英

在WinForms應用程序中使用外部DLL需要哪種配置?

[英]Which configuration do I need to use an external DLL in a WinForms application?

我正在使用外部DLL來使用我編寫的包裝器來使用OCR設備。 我已經對包裝器進行了測試,效果很好。 但是,當我使用WinForms項目來使用包裝器的客戶端類(位於另一個項目)時,調用從DLL導入的C#方法時出現錯誤(使用[DLLImport(...)] ),說DLL是未注冊。

錯誤說:

“找不到DLL庫函數。檢查注冊表安裝路徑。”

所有執行都是在調試模式下完成的。 我比較了兩個項目的配置。 最相關的區別是Test項目面向Any CPU和WinForms app只指向x86。

會是什么呢?

更新

  1. 我試圖使用Regsvr32.exe注冊該DLL,但它不起作用。 我想過使用Gacutil.exe但是需要卸載.net framework 1.1以外的所有框架...
  2. 我想知道......在測試環境中,一切都運行良好,因為測試框架有完全在windows中注冊的dll或可執行文件(或類似的東西),所以那些是可信賴的dll。 調試生成的dll可能不受Windows信任,因此出現了這個問題?
  3. 我在同一個令人不安的項目中創建了一個表單,然后從我添加到它的按鈕調用OCRWrapper。 OCR的工作!! 不幸的是,很難重寫第一張表格,因為我們已投入大量時間; 所以,我仍然想知道在令人不安的形式中我需要改變什么......
  4. 我從頭開始重新開始表單的開發並添加了與之相關的所有組件; 一切順利,OCR成功讀取所有數據。 當我使用對ObjectContext的調用加載組合框並再次出現錯誤時...我正在使用連接到Oracle的實體框架。

我有一個理論。

讓我們假設以下情況:

  • ocr.dll依賴於其他一些本機DLL,讓我們稱之為other.dll [A]
  • 您的ADO.NET提供程序使用底層的本機DLL(這對ODP.NET來說確實如此)依賴於other.dll [B] ,它恰好具有相同的名稱,但實際上是一個不同的DLL(或者至少是一個不同的DLL)版本)與other.dll相比[A]

然后,在運行時,可能會發生這種情況:

  • 當您連接到數據庫時,ADO.NET提供程序動態加載其本機DLL,包括other.dll [B]
  • 然后你嘗試從OCR DLL調用一個函數。 P / Invoke嘗試動態加載OCR DLL並成功,但是other.dll [B]已經加載,並且ocr.dll嘗試使用它的某些功能,而不是從其實際存在的其他文件[A]

歡迎來到DLL地獄。 所以,你可以做什么?

  • 嘗試改變對ocr.dll和ADO.NET提供程序的調用順序,以查看任何更改。 如果你(非常)幸運的話, other.dll [A]可能實際上是一個更新的版本,仍然可以向后兼容other.dll [B]並且奇怪地開始工作。
  • 嘗試另一個版本的ADO.NET提供程序。
  • 嘗試另一個ADO.NET提供程序。
  • 嘗試從您的供應商處獲取靜態鏈接的ocr.dll(即沒有對other.dll [A]的運行時依賴性)。

因此,對DLL的調用只能從一個按鈕進行,但它不適用於復雜的形式。 我會說有一個未定義的行為正在發生。 問題仍然是你是不是寫錯誤的編組,或者編寫錯誤的DLL。

由於我們無法訪問DLL的源代碼,您可以發布函數的原型,所有相關的結構定義以及您為其編寫的DllImport行嗎?

谷歌無法找到錯誤信息,這意味着(不是絕對:) :)它不是系統消息,而是來自dll代碼的自定義消息。 所以dll做了一些狡猾的事情。 我想它會嘗試在內部將您的調用重新調度到另一個函數。

我建議你嘗試的幾件事情:

  • 運行x86配置。 在項目屬性 - >構建選項卡中,將平台設置為x86。 這假設dll是x86 dll。

    dumpbin / headers orc.dll

      File Type: DLL FILE HEADER VALUES 14C machine (**x86**) 4 number of sections 4CE7B6FC time date stamp Sat Nov 20 11:54:36 2010 0 file pointer to symbol table 0 number of symbols E0 size of optional header 2102 characteristics Executable 32 bit word machine DLL 

這個命令行應該告訴你位數。 如果它是64位運行64位配置,但我敢打賭它是32位。

  • 不要在項目中包含dll。 我想你已經這樣做了。 確保dll位於%PATH%環境變量中的文件夾中。 在命令提示符下運行時:

其中ocr.dll

應該告訴你dll在哪里。 如果它沒有將安裝dll的文件夾添加到%PATH%。

暫無
暫無

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

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