我有一個VB6程序,它試圖運行用C#編寫的DLL。
這個DLL有一個COM接口,所以我可以使用「CreateObject」在其中創建一個類的對象。 問題是,它運行並運行良好,當我從VB6 IDE運行它,但是當我做一個EXE並嘗試運行它時,它會拋出異常:
「自動化錯誤。系統找不到指定的文件( -2147024894)。」運行exe時VB6中的createObject失敗
爲什麼會發生,我該如何解決?
我有一個VB6程序,它試圖運行用C#編寫的DLL。
這個DLL有一個COM接口,所以我可以使用「CreateObject」在其中創建一個類的對象。 問題是,它運行並運行良好,當我從VB6 IDE運行它,但是當我做一個EXE並嘗試運行它時,它會拋出異常:
「自動化錯誤。系統找不到指定的文件( -2147024894)。」運行exe時VB6中的createObject失敗
爲什麼會發生,我該如何解決?
查看IDE中的Project,References並查看哪些dll或ocx文件屬於您使用CreateObject引用的對象(對象管理器也可能有助於找出)。 這個DLL文件也必須在exe編譯時可用。通常,您需要將其註冊到regsvr32.exe。
我用來確定此類型問題的一種技術是在Visual Basic 6中打開添加引用對話框。我滾動可用COM庫的列表,查看是否列出了問題DLL。如果是,那麼CreateObject應該可以工作,你應該能夠指定它做一個變體變體,並使用後期綁定來訪問它的成員。
另外嘗試臨時設置對變量的引用,而不是使用CreateObject使用= New,並查看它給出的錯誤消息(如果有的話)。通常我發現它們比CreateObject引發的更具信息性。
最後,如果您發佈您選擇使用CreateObject而不是設置參考的原因,將會有所幫助。如果DLL是一個已知的對象,將被程序不斷使用,那麼應該設置一個引用,並且通常使用早期綁定。
最後可能是錯誤是由C#COM DLL而不是DLL自身的依賴造成的。例如,如果我要帶一個Com Library並正確註冊它,但它依賴於COM Library Widget2000,並且它沒有註冊,那麼它會拋出自動化錯誤。特別是如果您正在測試安裝環境中的EXE,而不是您所遵守的環境。
例如,假設我有一個用VB6編寫的CAD程序,並且我有以MyCAD開頭的源代碼樹。該exe文件位於MyCAD/MainEXE中,形狀庫位於MyCAD/ShapeLibrary中。我運行的IDE一切都很好。然後我做了我的設置並轉到我的測試機器並安裝它,並且它創建shapelibrary時出錯。
我會做的第一件事情就是檢查MainEXE是否會直接從我的源代碼樹的MainEXE目錄中運行。該測試將消除它是安裝問題還是IDE與編譯版本的怪癖。然後,我會查看設置並查看未註冊的內容。還要查看C#庫的源代碼或庫的設置,並查看它需要哪些依賴關係。由於它是一個兼容的COM DLL,因此您應該可以使用依賴關係walker工具來查看它需要的COM引用。最後確保安裝了正確版本的.NET框架。
如果您正在編譯測試機器上的C#DLL,請確保您勾選了register for COM Interop setting。如果您不在同一臺機器上編譯,則需要使用/ codebase選項運行RegAsm。
嘗試將其編譯爲安裝程序,幷包括您在編譯安裝程序包時使用的dll/com,以便您使用的dll/com將包含在您編譯的exe中,然後安裝它在窗口中不只是複製過去。
什麼操作系統?你正在運行IDE提升vs.作爲標準用戶編譯的程序?你可以在這個失敗的地方顯示一個小程序,即一些代碼,但不包含缺少重要細節的代碼片段嗎?請包括對象引用變量的聲明,以便我們看看您是遲到還是早綁定。 – Bob77 2011-06-05 11:32:59