2009-05-01 102 views
4

我一直試圖解決這個問題很長一段時間,似乎沒有任何工作。如何在.net項目中使用Reg-Free COM作爲vb6 dll引用?

我有一個用vb6編寫的COM DLL。我在.net中添加對此DLL的引用,並在引用上將'isolated'和'copy local'屬性設置爲true。顯然這應該可以實現免註冊。

但它不起作用。如果我嘗試在另一臺計算機上,或者用regsvr32註銷DLL,試圖訪問該DLL會引發異常(實質上是說所需的com類不存在)。 DLL和清單文件與EXE位於同一個文件夾中,但顯然它完全忽略了它們。

我在做什麼錯?我已閱讀了大量關於此的零散文章,但沒有一篇給我一個工作解決方案。我已經用視覺工作室做了修補,但無濟於事。我用make-my-manifest修飾了一小部分,但它不起作用(即使在測試項目中)。

回答

4

我在非UI線程上創建和使用com類。在這種情況下,vb6 DLL上的Reg-Free com顯然不起作用。此測試代碼顯示它:

Private Sub RunTest() Handles Button1.Click 
    Try 
     Dim x As New RegTestProject.RegTestCall 
     MsgBox(x.RegTestFunction()) 
    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 
End Sub 

Private Sub RunThreadedTest() Handles Button2.Click 
    'fails if reg-free COM is used' 
    Dim t As New Threading.Thread(AddressOf RunTest) 
    t.Start() 
End Sub 

當我運行這與正常註冊的DLL,這兩個測試成功。如果我使用無reg的COM,即使正常測試仍然成功,線程測試也會失敗。看起來這將是一個巨大的解決辦法。

+0

您是否曾經發現這是否與非ui線程默認創建爲MTA vs STA線程有關? – 2009-10-26 02:36:48

2

這是一個link,它描述了使用註冊免費的COM互操作。如果你已經這樣做,請發佈你的清單文件。你可能會錯過你的錯字。

編輯

只是一個想法可能比較簡單,只是註冊的dll首次應用在新機器上運行。註冊免費com interopt只適用於Windows XP和更新版本,所以如果你的目標是任何恐龍,它將無法正常工作。

3

我敢肯定,當你以這種方式引用COM組件時,每次構建時都會發生COM組件導入。這意味着COM組件必須在項目將要構建的每臺機器上以傳統方式註冊。

2

這是關於無reg COM的MSDN articleTroubleshooting部分的摘錄。道歉,如果你已經看到它。好消息是你已經是通過這些步驟的一部分。它建議在Windows Server 2003中重現問題(可能使用Virtual PC?),然後事件日誌應該有所幫助。

首先得到...您的客戶使用 註冊服務器;然後取消註冊 服務器並驗證您的錯誤 消息是您所期望的;和 終於...工藝和部署清單 文件。這樣,您的故障排除 努力...將被限制在您的清單文件的 結構中(並且如果您選擇,則 清單中的程序集正確嵌入清單 )。

當故障排除後免註冊COM 問題,該事件查看器 Windows Server 2003的上是你的朋友... 看在系統事件日誌來自COM服務器的事件。 我不建議你看看 Windows XP事件日誌... 它總是會包含一個 消息...這並不幫助 確定問題。

相關問題