2010-05-18 78 views
4

我有一個使用.Net組件(通過VB6應用程序中的.tlb引用)的VB6應用程序,它作爲已編譯的應用程序,但是當它試圖使用.NET組件時,它會在VB6 IDE中產生一個錯誤。VB6 App + .Net組件作爲已編譯的應用程序工作,但不在VB6中IDE

我應該注意到,當.NET組件打算調用第三方報告組件時發生錯誤。

問題是什麼? VB6 IDE可以在某個DLL的不同位置查找嗎? .tlb與應用程序可執行文件位於同一位置,所以我不這麼說應該會有問題。

我需要讓應用程序在IDE中運行,以便調試和逐步執行代碼。

+0

你能指定「它會產生一個錯誤」。什麼樣的錯誤?什麼是錯誤信息? – 2010-05-18 07:21:26

+0

這是特定於報告組件的錯誤。一些關於不能從字符串轉換爲其他類型的東西。底線是當應用程序在IDE之外運行時沒有錯誤。 – CJ7 2010-05-18 07:41:15

+0

你是否在使用.NET部件的app.config中的設置? – 2010-05-18 08:22:04

回答

3

這可能是由於運行時版本不匹配造成的。請嘗試以下操作:

爲IDE創建一個.config文件(例如,IDE可執行文件的EXE名稱+ .config)。

粘貼了下列文件:

<configuration> 
    <startup> 
    <supportedRuntime version="v2.0.50727"/> 
    <requiredRuntime version="v2.0.50727" safemode="true"/> 
    </startup> 
</configuration> 

這將確保在.NET 2運行時被加載,無論以何種順序.NET COM組件被激活時(其中的一些可以由IDE加載,導致進程中的運行時間不匹配)。

2

就像Lucero,我不知道配置文件......我最近有一個互操作場景,我必須爲vb6可執行文件創建一個配置文件,以便讓.net dll正確讀取appdomain內的設置在其中.net庫運行。在這種情況下,我能夠獲取現有的dll配置並將其複製爲vb6 .exe.config其中vb6是您的vb6可執行文件的名稱。

如果這個想法是正確的方向,我同意Lucero您的* .exe.config文件需要與IDE的源代碼可執行文件相關聯......我相信它是vb6.exe。

您可以通過暫時硬編碼設置來排除配置文件。如果這在VB6 IDE中起作用,那麼你知道你正朝着正確的方向前進。

+0

vb6可執行文件不需要.config文件 – CJ7 2010-06-05 06:48:47

+1

也許不是,但是配置文件的存在會影響所有加載的.net組件,所以它可能會有所作爲。 – 2010-06-05 14:52:47

1

我會嘗試使用/ codebase開關使用regasm註冊.net組件。如果程序集不在GAC中,該工具會給出警告,但除非在同一臺機器上有多個不同版本的程序集,否則您可以忽略該警告。

+0

爲什麼IDE會查看與可執行文件不同的程序集版本? – CJ7 2010-06-07 02:52:31

+0

不是我在說什麼,我可以想象沒有找到程序集,因爲它沒有在/ codebase開關中註冊。第二部分是關於wa該工具顯示:在許多情況下可以安全地忽略的警告。 – 2010-06-07 06:19:37

2

Mike L已經這樣說過,但我的回答here描述了關於VB6和exe.config文件的所有問題,我相信這是這裏的問題。

3

轉換異常不容易解釋爲程序的默認目錄有問題。當你從VB6 IDE運行你的應用程序而不是直接運行你的應用程序時,應該會有所不同。

你將不得不使用調試器來找出發生了什麼問題。幸運的是,當你使用VB6時很容易。首先在Visual Studio中打開.NET項目。項目+屬性,調試選項卡。選擇「啓動外部程序」,點擊帶點的按鈕並導航到vb6.exe。如果您使用默認安裝選項,它應該位於c:\ program files \ microsoft visual studio \ vb98 \ vb6.exe中。

您可以將「命令行選項」設置設置爲.vbp項目的路徑,以便IDE自動加載它。不是絕對必要的。

調試+異常,請檢查「公共語言運行時異常」拋出複選框。按F5啓動調試器。 VB6 IDE現在將打開,如果需要的話加載你的VB6項目。運行該項目並重新創建失敗案例。這應該會導致Visual Studio調試器中的斷點。您可能必須手動切換到該位置,任務欄按鈕應該閃爍。使用普通的調試工具找出拋出異常的原因。

請注意,您還可以在Visual Studio中設置斷點,如果您需要單步執行代碼以找出錯誤,那麼該斷點很有用。當您按下F5時,由於DLL尚未加載,斷點指示器變爲空白。只要VB6項目從您的.NET代碼創建一個類對象,該DLL就會被加載(在輸出窗口中可見),並且斷點指示器將變爲固定。如果這沒有發生,那麼您可能需要使用/ codebase選項運行Regasm.exe,以便項目bin \ Debug文件夾中的DLL被註冊爲COM服務器。

1

您可以嘗試以下操作。這可能是一個解決辦法,或者你也許能夠找出實際的問題是什麼:

  • 負載的.NET的DLL在Visual Studio中的項目屬性
  • ,調試選項卡,設置開始行動到 「啓動外部程序」,並將其設置爲 「C:\ Program Files文件\微軟的Visual Studio \ VB98 \ VB6.EXE」
  • F5,現在VB6將開始
  • 加載您的VB6項目在VB6調試
  • 調試。
0

有點舊,但不得不再次處理這個問題,以爲我會在這裏發佈我發現有必要的東西。

我已經有同樣的問題(傳統的VB6應用程序利用一些基於.NET的DLL通過ActiveX COM)。爲了得到這個工作,我不得不做下面的事情(可能跳過下面的一些,但我知道每個都需要在某一點或其他):

  1. 複製DLL和TLB文件複製到VB6 IDE EXE所在的文件夾(例如C:\ Program Files(x86)\ Microsoft Visual Studio \ VB98)。凌亂和煩人,但我還沒有找到一個替代方案。
  2. 添加一個合適的VB6.exe.config文件(如上所述)。
  3. 您也可能需要DLL的自身的.config文件(例如,如果您的.NET DLL名爲abc.dll,則配置文件將爲abc.dll.config)。似乎有些東西會從VB6配置文件中讀取,並從DLL配置文件中讀取其他東西。它可能可以計算出來自哪裏,但最簡單的方法就是使兩個配置文件相同。
  4. 確保您已經應用了VB6 SP6。
  5. 以管理員身份運行VB6 IDE。
  6. 在XP SP3兼容模式下運行VB6 IDE。

這是一種霰彈槍的方法,但使用上述我仍然可以在Windows 8.1 64位下使用VB6 IDE並調試VB6代碼(甚至通過附加Visual Studio IDE調試.NET COM組件)。

相關問題