2012-09-23 158 views
0

我已經在VB.NET(MSVS 2010)中編寫了一個用「COM可見」和「Register for COM interop」標誌啓用的小類庫。該庫適用於Windows 2008終端服務器。我碰到了兩個問題:在Windows上安裝com-enabled .net程序集終端服務器

  1. 註冊我的lib在服務器上。顯然,撥打regasm.exe my_lib.exe /tlb是不夠的。儘管regasm確實將 合適的密鑰放入註冊表中,但調用 CreateObject("My_lib_prog_id")會導致失敗。我通過在 服務器上安裝MSVS2010的試用版,暫時 解決了此問題,並在此處使用提升的權限運行它並構建了lib 。它的工作很好,直到...

  2. 作爲另一個用戶試圖調用lib的COM客戶端程序運行。它失敗了。

編輯:「失敗」意味着,VBA拋出,而這樣做Set obj = CreateObject("MyLibProgID")「系統找不到指定文件」的例外。它在Visual Studio註冊的相同用戶帳戶內工作正常。

我試着給執行acces到lib的目錄給所有人,但它沒有工作......任何想法,請嗎?

UPDATE

如果客戶端下運行任何其他用戶,即使用戶具有管理員權限的問題出現了。

+0

「......導致失敗」,「......失敗」。你能提供更多的細節嗎? – Joe

+0

更新了問題 – AlexVhr

+0

也許運行fuslogvw會有所幫助。 – Joe

回答

2

好的,首先,我發現.NET COM COM dll與VBA交互有很多問題。

首先,用.net通過屬性配置它們,以便它們在註冊表中正確配置很重要。確保Dll項目已被標記爲註冊COM互操作。其次,如果您使用MSI項目,請確保該軟件已標記爲「安裝所有用戶」。 MSI項目在刪除註冊表項方面做得非常差,所以如果你把MSI安裝,.net版本等搞糟了,你的服務器最終會出現「壞的註冊表項」。我最終使用regasm.exe正確註冊組件。我最終轉向了WIX項目安裝。

第三,您需要確保註冊表項是終端服務器的「機器/全局」範圍,因爲每個用戶都將運行一組潛在的「註冊表」項。如果您已經正確設置了名稱空間,那麼您應該能夠在VBA中進行早期綁定,而不是風險較大的後期綁定「CreateObject」調用。只要確保VBA在啓動過程中檢查「斷開的引用」。第四,我使用非常乾淨的虛擬機來測試我的安裝和註冊表項,在MS Office VBA引用的幫助下,確認COM部件已經正確註冊,所以「CreateObject」調用不會失敗。第五,小心終端服務器和辦公室的顯式版本(特別是Office 2010 x64)的x86/x64問題。如果服務器是x64,則可能必須顯式使用編譯器flags/86(任何CPU對於VBA .net COM對象都可能非常糟糕)。

第六,小心你從.net到COM引發異常的方式。查看System.Runtime.InteropServices.COMException以獲取正確的方法。

From cmd 
c: 
cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727{or the edition your using} 
COPY "\\Distribution Share\{YourCompany}\{Software}\{Edition}\{.net Com DLL name}.dll" "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.dll" 
Regasm.exe "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.dll" /u 
Regasm.exe "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.dll" /regfile:"C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.reg" /codebase 
cd C:\WINDOWS\System32\ 
Regedit.exe /s "C:\Program Files\{YourCompany}\{Software}\{.net Com DLL name}.reg" 

然後我仔細看看生成的註冊表文件,以確保它們位於正確的註冊表配置單元中。

+0

感謝提及System.Runtime.InteropServices.COMException –

+0

1.是的,我做到了。 2.不,我不使用MSI。只是xcopy整個項目目錄的部署,並嘗試手動註冊/ VS幫助3.我究竟如何「確保」它?不,早期綁定不是一種選擇。 4.我不認爲64/32的難題在這裏存在錯誤 - 如果在註冊的同一用戶中運行,它會運行得很好。此外,請參閱更新 – AlexVhr

+0

我回歸這些問題是打開MS Access/Excel並創建一個VBA模塊。然後我轉到「引用」來確認.net COM dll引用在列表中正確可用。有時你必須瀏覽到創建的* .tlb文件(而不是DLL)。如果在VBA中可以正常工作,那麼CreateObject(「Namespace.Class」)應該可以在任何你想要的環境下工作,參見http://social.msdn.microsoft.com/Forums/pl/isvvba/thread/3fee8d3d-3a65-4d03 -b4c1-a9b55ece1ffc快速瀏覽技術。 –

相關問題