簡體   English   中英

使用JavaScript從Com Visible dll調用.net dll時出錯

[英]Error when calling a .net dll from Com Visible dll using javascript

我正在開發Windows 7小工具,正在創建Activex對象並加載程序集。我正在遵循代碼項目 (GadgetInterop)此處提到的方法。 該小工具的任務之一是與Facebook交互。

這就是我的引用方式:Javascript創建了一個GadgetBuilder對象。 從這里加載我的庫。 說“ MyLibrary.dll”。

  • 當我說MyLibrary.GetCount()方法時(僅返回一些整數),它可以工作。
  • 但是,當我在方法內部調用MyLibrary.GetFaceBookFeeds()調用某些Facebook函數時,它將引發錯誤。我從CodePlex引用了“ facebook.dll”

如果我從ASP.NET表單測試我的代碼,則可以完美運行。 但是,當我嘗試通過使用javascript從html頁面運行它時,出現以下錯誤:

無法加載文件或程序集'facebook,Version = 2.1.3654.38113,Culture = neutral,PublicKeyToken = null'或其依賴項之一。 該系統找不到指定的文件。

我確認dll與“ MyLibrary.dll”位於同一文件夾中。

  1. 為什么會出現此錯誤?
  2. 我該如何完成任務? (我需要使用從javascript調用dll的方法,因為我們在dll中做了很多其他事情)。

您無需在桌面小工具中為.net代碼使用基於反射的程序集加載器,您可以使用類ID等將程序集編寫為com可見。 本文提供了一個使用.net來實現目標的示例正在嘗試沒有“適配器”的情況。

話雖這么說,基於Activex的桌面小工具存在各種問題,您應該注意:

  • 在小工具中創建ActiveX實例時,sidebar.exe將“鎖定打開”程序集dll,即使關閉了小工具,也無法刪除該文件。 不幸的是,小工具的卸載過程無法解決這個問題,小工具的卸載將導致sidebar.exe在無法刪除程序集時無法刪除文件,從而使程序集和所有其他尚未刪除的文件丟失刪除到那時。 也沒有顯示錯誤消息。 覆蓋小工具(例如,使用新版本)的情況也是如此-sidebar.exe嘗試在安裝新小工具包之前完全刪除該文件夾,導致大多數情況下安裝失敗。
  • 這種Activex控件的注冊可能非常棘手。 例如,您提供的CodeProject文章中提供的注冊表腳本不適用於Windows 7 x64。 解決此問題的唯一方法是使用WMI寫入注冊表。
  • 同樣,取消ActiveX控件的注冊也是一個問題。 當用戶卸載小工具時,注冊表項將被保留。 我想對於很多人來說這不是問題,但是想象一下一個小工具愛好者,他會嘗試發現的每個小工具突然發現許多未使用的注冊表項。 您可以通過在實例化對象后立即刪除注冊表項來解決此問題(因為它始終由邊欄進程緩存),並在下次啟動時再次對其進行重新注冊。

因此,實際上,盡管您可以在不進行反射的情況下進行操作,但是使用反射可能是更好的選擇,因為您可以將適配器程序集復制到備用文件夾,使用它加載當前程序集,然后在小工具關閉或使用完該組件時將其卸載。 這消除了第一個無法卸載小工具的問題,因為托管程序集位於另一個文件夾中,並且無論如何關閉小工具時,都會卸載反射的程序集。

facebook.dll之所以無法加載,是因為您使用的加載器無法正確解析依賴項(由於找不到位置,因此無法找到文件)。 歡迎您嘗試我們稱為PluginLoader的基於反射的程序集加載器,看看是否可行。 我們尚未發布它的正式版本,但我們打算使其廣泛可用,並建議所有開發人員使用它來嘗試消除ActiveX和Windows桌面小工具的問題。 由於我們尚未正式發布它,因此您必須安裝我們的小工具“ 拍賣側邊欄工具” ,該工具將安裝插件加載程序,以供以下代碼使用:

var plLoader = new ActiveXObject("Sidebar.PluginLoader");
var myLibrary = plLoader.LoadAssembly(classToLoad, 
                                System.Gadget.path+"\\path\\to\\MyLibrary.dll");
myLibrary.GetFaceBookFeeds();

要加載的類是需要以Namespace.Class格式(即MyLibrary.MyClass )加載的類。 我們專門對其進行了編碼,以正確解決任何依賴關系,因此它應該可以為您正常工作。 如果它對您有用,則歡迎將其包含在小工具中。 您需要做的只是AuctionSidebarTool文件夾中的PluginLoader.js和PluginLoader.dll文件,但是您需要編輯PluginLoader.js文件以刪除引用我們裝配體的零件(從第110行開始)。 如果將其包含在項目中,它將檢查是否存在現有的PluginLoader.dll,如果失敗,則將其復制到本地AppData中的Windows Sidebar文件夾中,進行注冊並為AddInLoader對象提供LoadAssemblyUnloadAssembly方法。 如果您需要其他幫助,請在評論中告訴我。

希望能有所幫助。 到目前為止,這可能是我寫的最長的答案:)

暫無
暫無

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

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